TCL全球难倒我

时间:2012-08-08 17:52:31

标签: global-variables tcl

我有一个脚本,我正在做的看似完全相同的东西,但它适用于那个而不是这个。我希望再多几双眼睛能够帮助我找出问题,我已经花了一个半小时。

我有一个编辑全局变量的proc,它更复杂,但为了简单起见我会使用它:

proc myCustomProc { var } {

global __myGlobal
set __myGlobal [ expr $__myGlobal + 1 ]
}

我在“main”过程中全局定义了一个变量:

proc FOO {} {
global __myGlobal
...
...
myCustomProc 5
puts $__myGlobal

然后我得不到“__myGlobal”:没有这样的变量

我有一个不同的varname工作在不同的脚本中的确切代码,所以我很难过。显然它不相同,我只是找不到问题。

编辑:两个proc都在同一个.tcl文件中

2 个答案:

答案 0 :(得分:2)

您无法从未设置的变量中读取,并且该变量是否为全局变量都是正确的。因此,在代码中:

set __myGlobal [ expr $__myGlobal + 1 ]

它首先从全局变量中读取值,然后将一个值添加到该值,然后将结果写回全局变量。 (实际上,它将变量的内容解释为一个表达片段,我会把它作为你不想要的东西,因为它很慢而且不安全;请把整个表达放在括号中。 )

为了将一个添加到一个整数(从Tcl 8.5开始),你应该只使用incr命令,因为它将一个不存在的值解释为零:

incr __myGlobal

但如果您正在做一些更复杂的事情(或者在8.4或之前工作),那么您应该在前面检查这样的info exists

if {![info exists __myGlobal]} {
    set __myGlobal "the default value";    # Or whatever default you want
}

您还可以使用更复杂的表达式:

set __myGlobal [expr {[info exists __myGlobal] ? $__myGlobal+1 : 1}]

但我通常会尽量避免使用三元运算符;它通常不那么可读。

答案 1 :(得分:0)

简短的回答是,在设置之前,您在expr命令中使用$ __ myGlobal。