在tcl中,当其名称由另一个变量组成时,无法读取变量

n00*_*mer 3 variables nested tcl

基本上,我正在做的是

set i 0

set log_$i "blah blah"

puts $log_$i;                  # expecting to see "blah blah"
Run Code Online (Sandbox Code Playgroud)

这会返回错误:

无法读取"log_":没有这样的变量

我尝试过各种不同的分组,似乎没什么用

Don*_*ows 11

你遇到的问题是$- 当它遇到一个$(以及许多其他标点符号)时,它会停止.

要使你正在做的工作,你要这样做来读取变量(使用set命令的单参数形式):

puts [set log_$i]
Run Code Online (Sandbox Code Playgroud)

这可以编译为您期望的字节码.

但…

如果可以避免,请不要这样做.

每当你考虑构造这样的变量时,你就更有可能需要使用数组:

set i 0
set log($i) "blah blah"
puts $log($i)
Run Code Online (Sandbox Code Playgroud)

确实有效.如果你真的需要处理一个名字被构造的变量,那么通常更容易构造一个(通常是局部的)变量别名,如下所示:

set i 0
upvar 0 log_$i v
set v "blah blah"
puts $v
Run Code Online (Sandbox Code Playgroud)

upvar命令是棘手的东西,并允许各种非常强大的技术.它还使变量的本地别名非常有效(尽管此别名不包括每次查找变量; upvar如果希望别名指向其他内容,则需要重新运行).