string - 当参数可以是列表或字符串时,TCL使用 “eq”或 “==”

标签 string compare tcl

我有以下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”是因为列表是一种字符串..or?

最佳答案

您似乎在那儿泡了些咸菜。首先,您可能不想在expr条件内使用if,因此这足够了:

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

由于您要比较的事物之一绝对是非数字的,因此,虽然eq运算符是等效的,但您可以使用==运算符。唯一的区别是,两个操作数都看起来像数字时,==将它们比较为数字时(如有必要,将它们解析为数字)。这意味着"1" == "0x01"尽管它们是完全不同的字符串。 eq运算符总是比较为字符串。

如何选择最好的?这实际上很容易:您是否认为比较两边都在处理数字?如果是,请使用==,否则请使用eq

要在expr中使用if,是一次动态选择操作符。确实不建议这样做,但是您可以这样做:
set op "=="
if { [expr {$Node_3} $op {"BadAngle"} ]} {
    return "BadAngle"
}

这很丑。 (请注意,我将其他所有内容放在大括号内以防止进行双重评估,并且我谨慎地正确平衡了所有方括号,这是使您陷入问题代码中的原因。)除非您这样做,否则请不要这样做。真的真的需要。

关于string - 当参数可以是列表或字符串时,TCL使用 “eq”或 “==”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17696432/

相关文章:

user-interface - 在 tcl tk gui 中隐藏和显示框架

C 检查数组中是否存在空间,如果不存在则重新分配更多空间?

java - 计算字符串中的某个字符(Java)

c - 如何比较C中链表中的每个项目?

c - C 中 Tcl 扩展的库路径

bash - 在 expect 脚本中输入 sudo 密码

JavaScript,字符串 : test string for presence of sub-string that includes an asterisk (*)

javascript - 如何使用 Javascript 从文本区域读取列表?

string - 如何测试一个字符串是否包含多个子字符串之一?

java - 从两个字符串数组返回公共(public)元素的最有效方法