Variables 在tcl中,can';当一个变量的名称由另一个变量组成时,不能读取该变量
基本上,我现在做的是Variables 在tcl中,can';当一个变量的名称由另一个变量组成时,不能读取该变量,variables,nested,tcl,Variables,Nested,Tcl,基本上,我现在做的是 set i 0 set log_$i "blah blah" puts $log_$i; # expecting to see "blah blah" 这将返回错误: 无法读取“日志”:没有此类变量 我尝试过各种不同的分组,但似乎没有任何效果。你遇到的问题是,$-替换在遇到$(以及许多其他标点符号)时停止 要使您所做的工作正常,您可以这样做来读取变量(使用命令的单参数形式): 它可以编译成您所期望的字节码类型 但是… 如果可以避免的话
set i 0
set log_$i "blah blah"
puts $log_$i; # expecting to see "blah blah"
这将返回错误:
无法读取“日志”:没有此类变量
我尝试过各种不同的分组,但似乎没有任何效果。你遇到的问题是,
$
-替换在遇到$
(以及许多其他标点符号)时停止
要使您所做的工作正常,您可以这样做来读取变量(使用命令的单参数形式):
它可以编译成您所期望的字节码类型
但是…
如果可以避免的话,就不要那样做
每当您考虑构建这样的变量时,您都很可能需要使用数组:
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
。另一种方法是
==>tclsh
% set i 0
0
% set log[set i] bb
bb
% puts "[set log[set i]]"
bb
另一种方式:
% set i 0
0
% set log(0) "blah blah"
blah blah
% puts $log($i)
blah blah
谢谢:)我现在使用了“set”命令,它工作得很好。将来我会尝试使用数组,但这里只有2个变量,所以这次我不会更改它。
% set i 0
0
% set log(0) "blah blah"
blah blah
% puts $log($i)
blah blah