'中的Tcl错误;如果';分支

'中的Tcl错误;如果';分支,tcl,Tcl,我得到一个错误: 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")} { -------} 这就是您应该如何编写它(对于变

我得到一个错误:

    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")} { -------}

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

如果您确实想使用
expr
(此处不太必要,因为
如果
使用
expr
),则应该是这样的:

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

但是我不建议像这样编写代码,因为按照我提到的第一种方式编写代码要简单得多

如果要检查大量字符串,可以使用(对于“not in”):


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

如果您确实想使用
expr
(此处不太必要,因为
如果
使用
expr
),则应该是这样的:

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

但是我不建议像这样编写代码,因为按照我提到的第一种方式编写代码要简单得多

如果要检查大量字符串,可以使用(对于“not in”):


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

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

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


它比较短。更清楚了。这是正确的…

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

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

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


它比较短。更清楚了。这是正确的…

interp别名{}::tcl::mathfunc::expr{}返回-code ok
也可以解决该问题。但是我认为这是个坏主意。
interp别名{}::tcl::mathfunc::expr{}返回-code ok
也可以解决这个问题。但是我认为这是个坏主意。顺便说一句,这些
ne
关系中至少有一个始终为真,这导致整个
如果
表达式始终为真。没错,Peter,我已将逻辑OR改为逻辑AND。谢谢。顺便说一句,这些
ne
关系中至少有一个始终为真,这导致整个
if
表达式始终为真。没错,Peter,我已将逻辑OR更改为逻辑AND。非常感谢。
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"} { -------}