Tcl评估,但我不确定

Tcl评估,但我不确定,tcl,Tcl,我有此命令,无法更改: 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

我有此命令,无法更改:

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
set var_command1 "[eval {global myvar ; [puts "Result= \$myvar"]}]"
得到这个结果:

结果=10

所以我尝试了eval命令:

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

正如我所说,这个命令可能不是正确的,而且我也不知道是否有可能…

您的过程没有计算该变量的内容。它可能只是读了几遍,最多只打印一次。当然,您可以将变量设置为对脚本求值的结果,但是在扫描该过程之前必须进行求值,至少除非您对读取跟踪进行了巧妙的处理。但不要这样做;这将是非常令人困惑和非常片状的实践!这是一个非常糟糕的想法,我不打算为它提供一个代码示例。实际上,不要使用跟踪来完成这项工作,因为这样做会使代码永远无法调试

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

如果要更改此过程,请将其更改为:

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

变化在于,它使用uplevel 1来计算调用方作用域中的脚本。如果脚本没有作为参数传递,则始终使用全局作用域也是可行的。此外,对于字符串比较,eq运算符优于==;在这种情况下,这并不重要,因为比较是针对一个非数字的,但使用右运算符生成的字节码稍好一些。

command1只是在全局变量中打印一个字符串。。。它不会先对它求值。我有这个命令,我不能更改它。正如肖恩所指出的,如果你不能改变命令1,那么你就无法实现你想要的。这就是你想要的吗?set var_command1 Result=$myvar;command1是@Rakend,但在我的程序command1中,正如@Shawn和@Calvin先生向我指出的,如果不修改我的程序@Donal Fellows,这是不可能的,答案很清楚,我需要更改我的程序……感谢@Donal Fellows提供了详细的答案并帮助了像我这样的初学者,不幸的是,我无法更改我的程序,但是我现在更了解uplevel函数了,谢谢你