2013-10-11 10 views
6

Hier ist das Beispiel. Aus irgendeinem seltsamen Grund denkt Perl, dass 1 and 0 ein echter Wert ist. Warum?Warum denkt Perl, dass '1 und 0' wahr ist?

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

Beachten Sie, dass es eine Warnung nicht geben. Leider gibt es nicht den Fehler "nutzlose Verwendung von ... im ungültigen Kontext", da diese Warnung für "0;" (und "1;") unterdrückt wird. – ikegami

+0

Nun, es gibt nur eine Warnung, wenn es als 'perl -we ...' ausgeführt wird (und die Warnung ist 'Gefunden = bedingt, sollte == bei -e Zeile 1.' sein). In meinem Beispiel 'perl -e ...' Ich habe keine Warnung bekommen. – bessarabov

+1

Was ist dein Standpunkt? Sie sollten immer 'use strict; Verwenden Sie Warnungen; '. Und doppelt so, wenn du nicht weißt, was vor sich geht. Ganz zu schweigen von der Überprüfung auf Fehler. (Gilt nicht hier, aber oh, so oft fragen Leute, was los ist, wenn sie nicht einmal nach Fehlern suchen!) – ikegami

Antwort

11

Operator Vorrang in Ihrem Beispiel ist

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

während das, was Sie wollen, ist:

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

oder

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

@bessarabov können Sie die Antwort akzeptieren, wenn es für Sie funktioniert. –

12

Da der Vorrang von and und && unterscheiden:

$x = 1 and 0 wie ($x = 1) and 0 ist, während $x = 1 && 0 wie $x = (1 && 0) ist.

Siehe perlop(1).

+6

Und insbesondere hat der Zuweisungsoperator ('=') eine niedrigere Priorität als '&&', aber eine höhere Priorität als 'und'. – amitparikh

6

Es ist nicht:

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