2016-02-03 70 views
1

我得到一個錯誤:Tcl錯誤的「如果」分支

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

試圖如果代碼分支下面。 $ env(EXB_DESIGN_NAME)的值被設置爲「seville2」。我想代碼不應該分支到'如果'條件。

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

順便說一句,至少這些'ne'關係中的一個將始終爲真,這導致整個if語句總是成立。 –

+0

這是正確的彼得,我已經改變了邏輯或爲邏輯與。謝謝。 – user3565150

回答

3

這就是你應該寫它(引號是可選的這裏也爲變量):

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(對於「不是」):

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

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

這是短。它更清晰。這是正確的...

+0

'interp alias {} :: tcl :: mathfunc :: expr {} return -code ok' could also fix that problem。但我認爲這是一個壞主意。 –