2013-10-11 18 views
6

Ecco l'esempio. Per qualche strana ragione Perl pensa che 1 and 0 sia un valore vero. Perché?Perché Perl pensa che `1 e 0` sia vero?

$ perl -e '$x = 1 and 0; print $x;' 
1 
+1

Si noti che lo fa dare un avvertimento. Sfortunatamente, non fornisce l'errore "uso inutile di ... in un contesto vuoto" poiché tale avviso è soppresso per '0;' (e '1;'). – ikegami

+0

Bene, avvisa solo quando è in esecuzione come 'perl -we ...' (e l'avviso è 'Found = in condizionale, dovrebbe essere == in -e linea 1.'). Nel mio esempio 'perl -e ...' Non ho ricevuto alcun avvertimento. – bessarabov

+1

Qual è il tuo punto? Devi sempre usare 'use strict; usare avvertenze; ​​'. E doppiamente così se non sai cosa sta succedendo. Per non parlare di verificare gli errori. (Non si applica qui, ma così tante volte le persone chiedono cosa c'è che non va quando non controllano gli errori!) – ikegami

risposta

11

Precedenza degli operatori nel tuo esempio è

perl -e '($x = 1) and 0; print $x;' 

mentre ciò che si vuole è:

perl -e '$x = (1 and 0); print $x;' 

o

perl -e '$x = 1 && 0; print $x;' 
+0

@bessarabov puoi accettare la risposta se funziona per te. –

12

Poiché la precedenza di and e && differire:

$x = 1 and 0 è come ($x = 1) and 0, mentre $x = 1 && 0 è come $x = (1 && 0).

Vedere perlop(1).

+6

E in particolare, l'operatore di assegnazione ('=') ha una precedenza inferiore rispetto a '&&', ma una precedenza più alta di 'and'. – amitparikh

6

Non è così:

$ perl -e '$x = (1 and 0); print $x;' 
0 
Problemi correlati