我有一个脚本,我正在做的看似完全相同的东西,但它适用于那个而不是这个。我希望再多几双眼睛能够帮助我找出问题,我已经花了一个半小时。
我有一个编辑全局变量的proc,它更复杂,但为了简单起见我会使用它:
proc myCustomProc { var } {
global __myGlobal
set __myGlobal [ expr $__myGlobal + 1 ]
}
我在“main”过程中全局定义了一个变量:
proc FOO {} {
global __myGlobal
...
...
myCustomProc 5
puts $__myGlobal
然后我得不到“__myGlobal”:没有这样的变量
我有一个不同的varname工作在不同的脚本中的确切代码,所以我很难过。显然它不相同,我只是找不到问题。
编辑:两个proc都在同一个.tcl文件中
答案 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。