我在文件FILE1中设置了3个全局变量:
set VAR1 2
set VAR2 3
set VAR3 4
现在我想以迭代的方式在另一个文件FILE2中使用这3个变量:
意思是这样的:
for {set a 1} {$a < 4} {incr a} {
$::VAR$a
}
其中VAR $ a - 每次都应增加到VAR1,VAR2,VAR3等......
但是如果我使用全局变量尝试这样,我会在tcl
中得到错误对此更好的解决方案吗?
答案 0 :(得分:2)
要么让你的意思更清楚地解释,
set ::VAR$a
(你知道这只是获取变量值而不对值进行任何操作,即无意义的操作,对吧?)
或者使用一个数组,它基本上是一个由两部分组成的变量名:
set ::VAR($a)
在这种情况下,您需要初始化为数组:
set VAR(1) 2
等,或
array set VAR {1 2 2 3 3 4}
$::VAR$a
始终无效的原因是AFAICT变量替换变得模糊不清。鉴于这些定义:
set foobar 1
set a foo
set b bar
$a$b
应该替代什么?为了避免歧义,替换规则保持简单:第一个替换在第二个美元符号之前停止,整个表达式求值为字符串foobar
。那么$$a$b
如何替换foobar
的价值呢?不,一个美元符号直接跟一个不能成为变量名称一部分的字符意味着第一个美元符号只是一个美元符号:你得到$foobar
。处理此问题的最佳方法是使用set
命令减少替换级别以获取值:set $a$b
。底线:使用$
进行变量替换并不总是有效,但set
始终可以胜任。