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
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
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;'
@bessarabov können Sie die Antwort akzeptieren, wenn es für Sie funktioniert. –
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).
Und insbesondere hat der Zuweisungsoperator ('=') eine niedrigere Priorität als '&&', aber eine höhere Priorität als 'und'. – amitparikh
Es ist nicht:
$ perl -e '$x = (1 and 0); print $x;'
0
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
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
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