当参数可以是列表或字符串时,TCL 使用"eq"或"=="



我有以下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"
}

它很难看。(请注意,我把其他所有东西都放在自己的大括号里,以防止双重评估,我会小心地正确平衡所有的大括号,这就是你在问题中遇到的代码。)除非你真的真的需要,否则不要这样做。

您的尝试中有两个明显的问题:

  1. 在第一个示例中,您试图以错误的方式调用exprif(以及其他支持条件的命令,如while)使用与expr命令相同的机制来评估它们的条件—引用手册:

    if命令将expr1计算为表达式(与expr计算其参数的方式相同)。

    现在,机器看到了一个赤裸裸的单词"expr",不知道该怎么办。

    有两种方法可以修复代码:

    • 错误的方式—正确调用expr:

       if {[expr {$Node_3 eq "BadAngle"}]} { ... }
      

      这是错误的,因为对expr的嵌套调用纯粹是肤浅的。

    • 正确的方式—只需放下不需要的expr:

       if {$Node_3 eq "BadAngle"} { ... }
      
  2. 在第二个示例中,您决定通过引入另一个布尔测试(不需要,因为eq==运算符已经返回布尔类型的值)来使情况更加复杂。但在这种情况下,您忘记了放置结束大括号},它执行分组,因为代码应该是

    if { [ expr { $Node_3 eq "BadAngle" } ] == 1 } } { ... }
    

在任何情况下,正确的解决方案都是简单地使用

if {$Node_3 eq "BadAngle"} { ... }

最新更新