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

tcl:如何使用变量的值创建新变量,tcl,Tcl,这是一个我正在尝试做的例子 set t SNS set ${t}_top [commands that return value] 要获取存储在${t}\u top的信息吗 puts “${t}_top”  SNS_top (really want the data stored there?) 我想是:${$t}{u top},可能是perl,但{}中的{}不起作用。试试看 puts [set ${t}_top] Tcl中的每一行代码只在替换阶段(其中变量、命令等被替换)运行一次。

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

set t SNS
set ${t}_top  [commands that return value]
要获取存储在${t}\u top的信息吗

puts “${t}_top”
 SNS_top  (really want the data stored there?)
我想是:${$t}{u top},可能是perl,但{}中的{}不起作用。

试试看

puts [set ${t}_top]

Tcl中的每一行代码只在替换阶段(其中变量、命令等被替换)运行一次。。。通常地就其本身而言

set var1 1
set var2 var1
set var3 $$var2
不会以var3等于1结束,因为替换符将“$$var2”替换为“名为“$var2”(字面意思)的变量的值”并停止

你需要的是,它要么以另一种方式行事,要么迫使你进行另一轮替换。另一种方法通常是避免第二轮换人(如Jackson所示):


在这里,在替换过程中,$var2被替换为“var1”。。。然后[set var1]返回1。。。然后var3被设置为“1”的值。。。您很好。

关于Tcl的一个真正有趣的事情是,您可以动态创建变量名,正如您在发布的问题中所做的那样。然而,这使得编写起来很棘手,并且使您的代码难以理解

与其试图找出如何做${$t}u 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]

同样有效,并避免使用“set”操作,因此语法错误不应覆盖您的数据。

这是非常糟糕的风格,因为它有潜在的执行危险。(考虑变量名“
::argc+[file delete-force/]+$
”)Jackson答案的标准语法是安全的,Bryan的答案才是真正应该做的。我同意,并且我认为任何动态创建变量名的方法都是糟糕的风格。我试图纠正OP的语法,而不是他们的风格。我认为像你这样的不正确的例子永远不会成为问题,因为
t
应该始终在你的控制之下(我无法想象根据用户/外部输入构建变量名会有什么意义)。设置星期一开始时间“somestring”设置变量“星期一”设置开始时间“$var\u开始时间”[string range$start\u time 0 3]这就给了“mond”我怎么能在输出中得到“一些”?
puts [expr $${t}_top]