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

时间:2010-12-13 09:13:21

标签: variables nested tcl

基本上,我正在做的是

set i 0

set log_$i "blah blah"

puts $log_$i;                  # expecting to see "blah blah"

这会返回错误:

  

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

我尝试了所有不同类型的分组,似乎没有任何工作

3 个答案:

答案 0 :(得分:11)

您遇到的问题是$ - 当遇到$(以及其他许多标点符号)时,替换也会停止。

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

puts [set log_$i]

这完全符合您期望的那种字节码。

BUT ...

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

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

set i 0
set log($i) "blah blah"
puts $log($i)

工作。如果你真的需要处理一个名字被构造的变量,那么通常更容易构造一个(通常是局部的)变量别名:

set i 0
upvar 0 log_$i v
set v "blah blah"
puts $v

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

答案 1 :(得分:0)

另一种做法是

==> tclsh的

% set i 0

0

% set log[set i] bb

bb

% puts "[set log[set i]]"

bb

答案 2 :(得分:0)

另一种方式:

% set i 0
0
% set log(0) "blah blah"
blah blah
% puts $log($i)
blah blah