'if' 分支中的 Tcl 错误

Tcl error in 'if' branching

我遇到一个错误:

    invalid command name "tcl::mathfunc::expr"

同时尝试以下 if 代码分支。 $env(EXB_DESIGN_NAME) 的值设置为 "seville2"。我希望代码不应该分支到 'if' 条件。

    if {expr("$env(EXB_DESIGN_NAME)" ne "seville") || expr("$env(EXB_DESIGN_NAME)" ne "seville2")} { -------}

这就是您应该如何编写它(对于变量,此处的引号也是可选的):

if {"$env(EXB_DESIGN_NAME)" ne "seville" || "$env(EXB_DESIGN_NAME)" ne "seville2"} {
  #Do something
}

如果你绝对想使用 expr (这里不是很必要,因为 if 使用 expr),它会是这样的:

if {[expr {"$env(EXB_DESIGN_NAME)" ne "seville"}] || [expr {"$env(EXB_DESIGN_NAME)" ne "seville2"}]} {
  #Do something
}

if {[expr {"$env(EXB_DESIGN_NAME)" ne "seville" || "$env(EXB_DESIGN_NAME)" ne "seville2"}]} {
  #Do something
}

但我不建议编写这样的代码,因为 if 因为用我提到的第一种方式编写代码要简单得多。

如果你有很多字符串要检查,你可以使用 ni(对于 'not in'):

set mylist {"seville" "seville2"}
if {$env(EXB_DESIGN_NAME) ni $mylist} {
  #Do something
}

Tcl 将表达式中的函数转换为对 tcl::mathfunc 命名空间中等效命令的调用。

但是,您真正的问题是您在已经是表达式的上下文中使用 expr 作为函数!你不需要那种复杂性。这意味着我们可以改变:

if {expr("$env(EXB_DESIGN_NAME)" ne "seville") || expr("$env(EXB_DESIGN_NAME)" ne "seville2")} { -------}

进入:

if {$env(EXB_DESIGN_NAME) ne "seville" || $env(EXB_DESIGN_NAME) ne "seville2"} { -------}

它更短了。更清楚了。没错…