tcl:如何使用变量的值来创建新变量

时间:2009-10-23 12:55:13

标签: tcl

这是我正在尝试做的一个例子。

set t SNS
set ${t}_top  [commands that return value]

想要将信息存储在$ {t} _top

puts “${t}_top”
 SNS_top  (really want the data stored there?)

以为它是:$ {{$ t} _top},也许那是perl但{}内部{}不起作用。

4 个答案:

答案 0 :(得分:7)

关于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)

大多数人都认为后一个例子更具可读性。

答案 1 :(得分:3)

尝试

puts [set ${t}_top]

答案 2 :(得分:2)

Tcl中的每一行代码都通过替换阶段(其中变量,命令等被替换)仅运行一次......通常。因此,像

set var1 1
set var2 var1
set var3 $$var2

不会因为var3等于1而结束,因为替代者将“$$ var2”替换为“名为'$ var2'(字面意思)的变量的值”并停止。

你需要做什么才能采取另一种方式或强制进行另一轮替换。另一种方式通常是避免需要第二轮替换(如杰克逊所示):

set var3 [set $var2]

这里,$ var2在替换期间被替换为“var1”...然后[set var1]返回1 ...然后var3被设置为值“1”......你很好

答案 3 :(得分:0)

语法

puts [expr $${t}_top]

也可以,并且避免使用'set'操作,因此语法错误不应该覆盖您的数据。