2013-07-17 8 views
5

Ho il seguente quando loop:TCL uso "eq" o "==" quando l'argomento può essere una lista o una stringa

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

node_3 può essere un elenco contenente le coordinate, o la stringa semplice " BadAngle " Uso TCLPro 1.4 per il debug e TCL 8.6. Ottengo: Errore di

* sintassi nell'espressione "expr {$ node_3 eq "BadAngle"}" *

Allora ho provato anche:

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

ma ottengo lo stesso errore. Inoltre: Qual è l'alternativa migliore in questo caso: per usare "==" o "eq", penso "eq" perché una lista è un tipo di stringa ... o?

risposta

6

Sembra che tu ti stia avvicinando un po '. In primo luogo, si probabilmente non si desidera utilizzare expr all'interno la condizione if, quindi questo sarà sufficiente:

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

Dal momento che una delle cose che si stanno confrontando contro è sicuramente non numerico, sarete bene usando l'operatore eq sebbene l'operatore == sia equivalente. L'unica volta che c'è una differenza è quando entrambi gli operandi assomigliano ai numeri, quando == li confronta come numeri (analizzandoli in numeri se necessario). Ciò significa che "1" == "0x01" nonostante siano stringhe piuttosto diverse; l'operatore eq si confronta sempre come stringhe.

Come scegliere quale è il migliore? In realtà è piuttosto semplice: pensi di lavorare con i numeri a questo punto su entrambi i lati del confronto? In caso affermativo, utilizzare == e utilizzare altrimenti eq.


L'unica volta che si desidera utilizzare expr all'interno if è quando si sta selezionando in modo dinamico l'operatore. Questo non è veramente raccomandato, ma lo farebbe in questo modo:

set op "==" 
if { [expr {$Node_3} $op {"BadAngle"} ]} { 
    return "BadAngle" 
} 

È piuttosto brutto. (Si noti che ho messo tutto il resto all'interno delle proprie parentesi per evitare una doppia valutazione, e sto attento a bilanciare correttamente tutte le parentesi, che è quello che ti ha incastrato nel codice della tua domanda.) Non farlo a meno hai davvero bisogno di .

+0

Inoltre, 'Inf' e' NaN' sono numerici (sebbene quest'ultimo sia probabilmente un errore controllato molto presto in seguito, i NaN sono cose strane) in base all'aritmetica in virgola mobile TCL e IEEE. –

3

Hai due problemi distinti nei vostri tentativi:

  1. Nel primo esempio si sta cercando di chiamare expr in modo sbagliato: if (e altri comandi che supportano le condizioni, come ad esempio while) utilizzare gli stessi macchinari per valutare la loro condizione il comando expr non — citare the manual:

    il comando if valuta expr1 come espressione (nello stesso modo in cui expr valuta il suo argomento).

    Ora che la macchina vede una parola "expr" e non ha idea di cosa farne.

    Ci sono due modi per risolvere il codice:

    • modo sbagliato — correttamente chiamano expr:

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

      Questo è sbagliato perché la chiamata annidata a expr è puramente superficiale.

    • modo corretto — basta semplicemente inserire non necessari expr:

      if {$Node_3 eq "BadAngle"} { ... } 
      
  2. Nel secondo esempio avete deciso di fare il situaton più complicato con l'introduzione di un altro test booleano (non necessario in quanto gli operatori eq e == già restituisce un valore di tipo booleano). Ma in questo caso si è dimenticato di mettere la parentesi graffa di chiusura, }, che esegue il raggruppamento, per il codice avrebbe dovuto essere

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

In ogni caso la soluzione corretta è di usare semplicemente

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