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
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
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;'
@bessarabov puoi accettare la risposta se funziona per te. –
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).
E in particolare, l'operatore di assegnazione ('=') ha una precedenza inferiore rispetto a '&&', ma una precedenza più alta di 'and'. – amitparikh
Non è così:
$ perl -e '$x = (1 and 0); print $x;'
0
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
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
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