0

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

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

proc myCustomProc { var } {

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

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

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

然后我无法阅读“__myGlobal”:没有这样的变量

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

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

4

2 回答 2

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}]

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

于 2012-08-09T12:37:44.057 回答
0

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

于 2012-08-09T12:53:00.727 回答