tcl:如何使用变量的值创建一个新变量
问题描述:
这里是我正在尝试做的一个例子。tcl:如何使用变量的值创建一个新变量
set t SNS
set ${t}_top [commands that return value]
想获得储存在$横置的信息_top
puts “${t}_top”
SNS_top (really want the data stored there?)
以为是:$ {{$ T} _top},也许这是perl的,但{}里的{}不工作。
答
尝试
puts [set ${t}_top]
答
的代码中的Tcl的每一行是通过置换阶段(其中变量,命令等被取代的)只运行一次...一般。因此,像
set var1 1
set var2 var1
set var3 $$var2
不会VAR3等于1拉闸,因为substitutor将替换为“$$ VAR2”,“名为‘$ VAR2’(直译)的变量的值”,并停止。
你需要什么来改变事情的另一种方式,或者迫使另一轮替代。另一种方法通常是避免需要一个第二轮取代(如由杰克逊示出):
set var3 [set $var2]
在这里,$ VAR2被替换,替换过程中,通过“VAR1” ...然后[组VAR1]返回1 ...然后var3被设置为“1”的值...并且你很好。
答
有关Tcl的一个非常有趣的事情是,您可以动态创建变量名称,就像您在发布的问题中所做的那样。但是,这使得编写代码变得非常棘手,并且使代码难以理解。
与其试图弄清楚如何做$ {{$ t} _top}的等价物,完全可以避免这个问题。你可以通过使用关联数组来做到这一点。
例如,而不是这样的:
set t SNS
set ${t}_top [commands that return value]
...
puts [set ${t}_top]
这样做:
set t SNS
set top($t) [commands that return value]
...
puts $top($t)
多数人认为后者的例子是更具可读性。
答
语法
puts [expr $${t}_top]
工作为好,并使用“设置”操作这么一个语法错误不应该覆盖您的数据避免。
这是非常糟糕的风格,因为它有潜在的执行风险。 (考虑迂回变量名“':: argc + [file delete -force /] + $'”。)Jackson的答案的标准语法是安全的,Bryan的答案是*真正应该完成的。 – 2010-05-03 15:47:37
我同意,我会争辩说任何动态创建变量名称的方法都是不好的风格。我试图更正OP的语法,而不是他们的风格。我认为像你这样的狡猾的例子永远不会是一个问题,因为't'应该总是在你的控制之下(我无法想象一个基于用户/外部输入建立变量名是有意义的情况)。 – bta 2010-05-03 16:56:49