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
运算符比 ==
更适合用于字符串比较;在这种情况下这并不重要,因为比较是针对非数字进行的,但是使用正确的运算符会生成稍微更好的字节码。
我有这个命令,我不能改变它:
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
运算符比 ==
更适合用于字符串比较;在这种情况下这并不重要,因为比较是针对非数字进行的,但是使用正确的运算符会生成稍微更好的字节码。