Tcl Eval ,但我不确定

Tcl Eval , but I'm not sure

我有这个命令,我不能改变它:

proc command1 {} {

    global var_command1

    if {$var_command1 == "" } {
        puts "nothing..."
    } else {
        puts $var_command1
    }
}

我想将这个变量发送到这个命令:

set myvar 10
set var_command1 "global myvar; Result= $myvar"
command1

并得到这个结果:

Result= 10

所以我尝试了 eval 命令:

set var_command1 "[eval {global myvar ; [puts "Result= $myvar"]}]"

正如我所说,这个命令可能不正确,我也不知道是否可行...

您的程序不会评估该变量的内容。它只是读取它(可能多次)并最多打印一次。当然,您可以将变量设置为评估脚本的结果,但必须在扫描该过程之前完成评估,至少除非您对读取跟踪执行某些操作 "clever"。但是不要那样做;这在实践中只会让人非常困惑并且非常不稳定! (这是一个如此可怕的想法,我不会为其提供代码示例。真的不要使用跟踪来做到这一点,因为您将编写永远无法调试的代码。)

一般来说,Tcl 会谨慎地不评估代码,除非被直接告知这样做,因为意外的评估将是一个最高级别的安全漏洞,并且是大量错误和其他缺陷的来源。

如果你想改变程序,它应该变成这样:

proc command1 {} {
    global var_command1
    set result [uplevel 1 $var_command1]
    if {$result eq ""} {
        puts "nothing..."
    } else {
        puts $result
    }
}

变化是它使用 uplevel 1 在调用者的范围内评估脚本(uplevel #0 始终使用全局范围也是可行的,因为脚本不是作为参数传递)。此外,eq 运算符比 == 更适合用于字符串比较;在这种情况下这并不重要,因为比较是针对非数字进行的,但是使用正确的运算符会生成稍微更好的字节码。