我有以下if循环:
if { expr { $Node_3 eq "BadAngle" } } {
return "BadAngle"
}
Node_3可以是包含坐标的列表,也可以是简单的字符串"BadAngle"我使用TCLPro 1.4进行调试,使用TCL 8.6。我得到:
*表达式"expr{$Node_3 eq"BadAngle"}"中的语法错误*
然后我也尝试了:
if { [ expr { $Node_3 eq "BadAngle" ] == 1 } } {
return "BadAngle"
}
但我也犯了同样的错误。另外:在这种情况下,什么是更好的选择:要使用"=="或"eq",我认为"eq"是因为列表是一种字符串。。或
你在那里似乎有点麻烦。首先,您可能不想在if
条件中使用expr
,所以这就足够了:
if { $Node_3 eq "BadAngle" } {
return "BadAngle"
}
由于您要比较的对象之一肯定是非数字的,因此使用eq
运算符是可以的,尽管==
运算符是等效的。唯一有区别的时候是当两个操作数看起来都像数字时,==
会将它们作为数字进行比较(必要时将它们解析为数字)。这意味着"1" == "0x01"
,尽管它们是相当不同的字符串;CCD_ 7运算符总是作为字符串进行比较。
如何选择最好的?这其实很容易:你认为你在这一点上处理的是比较双方的数字吗?如果是,则使用==
,否则使用eq
。
您希望在if
中使用expr
的一次是在动态选择运算符时。这不是真正的推荐,但你可以这样做:
set op "=="
if { [expr {$Node_3} $op {"BadAngle"} ]} {
return "BadAngle"
}
它很难看。(请注意,我把其他所有东西都放在自己的大括号里,以防止双重评估,我会小心地正确平衡所有的大括号,这就是你在问题中遇到的代码。)除非你真的真的需要,否则不要这样做。
您的尝试中有两个明显的问题:
-
在第一个示例中,您试图以错误的方式调用
expr
:if
(以及其他支持条件的命令,如while
)使用与expr
命令相同的机制来评估它们的条件—引用手册:if命令将expr1计算为表达式(与expr计算其参数的方式相同)。
现在,机器看到了一个赤裸裸的单词"expr",不知道该怎么办。
有两种方法可以修复代码:
-
错误的方式—正确调用
expr
:if {[expr {$Node_3 eq "BadAngle"}]} { ... }
这是错误的,因为对
expr
的嵌套调用纯粹是肤浅的。 -
正确的方式—只需放下不需要的
expr
:if {$Node_3 eq "BadAngle"} { ... }
-
-
在第二个示例中,您决定通过引入另一个布尔测试(不需要,因为
eq
和==
运算符已经返回布尔类型的值)来使情况更加复杂。但在这种情况下,您忘记了放置结束大括号}
,它执行分组,因为代码应该是if { [ expr { $Node_3 eq "BadAngle" } ] == 1 } } { ... }
在任何情况下,正确的解决方案都是简单地使用
if {$Node_3 eq "BadAngle"} { ... }