【问题标题】:Global variable usage in tcltcl 中的全局变量使用
【发布时间】:2017-09-22 02:53:04
【问题描述】:

我在文件 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 中得到错误

有什么更好的解决方案吗?

【问题讨论】:

  • 这正是 arrays 的用途。

标签: tcl


【解决方案1】:

要么让解释器更清楚你的意思

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 总是可以完成这项工作。

文档: set, Summary of Tcl language syntax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多