Tcl中通过变量动态命名变量失败,请求排查代码问题
Tcl脚本动态变量问题修正
你的脚本问题出在puts语句的变量读取部分,Tcl的变量替换是单层的,${pat$i}无法自动嵌套解析出pat0、pat1这类动态生成的变量名。
错误原因
当Tcl解析"pat$i=${pat$i}"时,只会把$i替换成当前数字(比如0),但${pat$i}不会被进一步解析为pat0这个变量——Tcl会直接把拼接后的pat0当作字面变量名尝试读取,不符合Tcl的变量解析规则,自然无法正确获取值。
修正方案
有两种简单可行的解决方法:
方法1:用set命令读取动态变量
set命令可以直接接受动态生成的变量名作为参数,返回对应变量的值,修改puts语句即可:
set i 0 foreach pattern { tiger cat horse dog} { set pat$i abc puts "pat$i=[set pat$i]" set i [expr {$i + 1}] }
方法2:用subst强制二次替换
通过subst命令让Tcl对字符串做两次替换:先解析$i得到数字,再解析生成的$pat0这类变量:
set i 0 foreach pattern { tiger cat horse dog} { set pat$i abc puts [subst "pat$i=\$pat$i"] set i [expr {$i + 1}] }
运行修正后的脚本,就能得到你期望的输出:
pat0=abc pat1=abc pat2=abc pat3=abc
内容的提问来源于stack exchange,提问作者vikas
相关产品推荐
相关产品推荐

