"||" und "or" nicht dasselbe!?!
Volker
- perl
0 Cheatah0 Volker
0 Christian Kruse0 Volker
Hallo,
ich dachte bisher immer (so wie es auch in Selfhtml steht) das "||" und "or" dasselbe ist. Dem ist nicht der Fall. Wie ich bei einem unerklärlichen Fehler schliesslich herrausgefunden habe gibt es zumindest ein Prioritätsunterschied:
print 0 || 1 ? "hallo" : "huhu";
ergebnis: hallo
print $a = 0 || 1 ? "hallo" : "huhu";
ergebnis: hallo
print 0 or 1 ? "hallo" : "huhu";
ergebnis: 0
print $a = 0 or 1 ? "hallo" : "huhu";
ergebnis: 0
interessant sind auch folgendes unterschiedliche ergebnisse (sollte eigentlich dasselbe sein):
print (0 or 1) ? "hallo" : "huhu";
ergebnis: 1
print $a = (0 or 1) ? "hallo" : "huhu";
ergebnis: hallo
hat jemand genauere informationen? in meinen quellen wird nicht unterschieden zwischen den beiden operatoren. oder gibt es hier einen fehler im interpretor?
gruss volker
Hi,
ich dachte bisher immer (so wie es auch in Selfhtml steht) das "||" und "or" dasselbe ist.
das steht tatsächlich in SelfHTML (wo)? Oder hast Du es nur so interpretiert?
Dem ist nicht der Fall.
Nein, in der Tat. Die Unterschiede sind in
perldoc perlop
recherchierbar. Insbesondere die Wertigkeit Bindungen betreffend sind interessant.
print 0 || 1 ? "hallo" : "huhu";
Ist identisch mit:
print (0 || 1) ? "hallo" : "huhu";
print 0 or 1 ? "hallo" : "huhu";
Ist identisch mit:
(print 0) or (1 ? "hallo" : "huhu");
print (0 or 1) ? "hallo" : "huhu";
Ist identisch mit:
(print (0 or 1)) ? "hallo" : "huhu";
in meinen quellen wird nicht unterschieden zwischen den beiden operatoren.
Dann gehört die Perl-Doku nicht zu Deinen Quellen, was ich als schwerwiegenden Fehler bezeichnen möchte.
Cheatah
das steht tatsächlich in SelfHTML (wo)? Oder hast Du es nur so interpretiert?
nun es steht zumindest nicht drin das sie unterschiedlich sind, falsch ist es aber tatsächlich nicht, da sich der text nicht auf prioritäten eingeht.
http://selfhtml.teamone.de/cgiperl/sprache/operatoren.htm#logisch
Dann gehört die Perl-Doku nicht zu Deinen Quellen, was ich als schwerwiegenden Fehler bezeichnen möchte.
Klar benutze ich perdoc, wusste hier nur nicht das es perlop gibt )
gruss volker
Hallo Volker,
das Verhalten erklaert sich aus dem Benutzen fehlerhafter
Beispiele :)
ich dachte bisher immer (so wie es auch in Selfhtml steht)
das "||" und "or" dasselbe ist. Dem ist nicht der Fall.
Nein. Der Unterschied liegt in der Prioritaet der
Operatoren. Prioritaets-Tabelle:
SYNOPSIS
Perl operators have the following associativity and precedence, listed
from highest precedence to lowest. Operators borrowed from C keep the
same precedence relationship with each other, even where C's precedence
is slightly screwy. (This makes learning Perl easier for C folks.)
With very few exceptions, these all operate on scalar values only, not
array values.
left terms and list operators (leftward)
left ->
nonassoc ++ --
right **
right ! ~ \ and unary + and -
left =~ !~
left * / % x
left + - .
left << >>
nonassoc named unary operators
nonassoc < > <= >= lt gt le ge
nonassoc == != <=> eq ne cmp
left &
left | ^
left &&
left ||
nonassoc .. ...
right ?:
right = += -= *= etc.
left , =>
nonassoc list operators (rightward)
right not
left and
left or xor
print 0 || 1 ? "hallo" : "huhu";
ergebnis: hallo
print $a = 0 || 1 ? "hallo" : "huhu";
Du meinst hier wohl '$a == 0'? Mit '$a = 0' weisst du $a
einen Wert zu, und diese Zuweisung wird fast immer 'true'
ergeben. Der -w Flag haette dir das aber auch gezeigt.
print $a = 0 or 1 ? "hallo" : "huhu";
ergebnis: 0
Dito hier.
interessant sind auch folgendes unterschiedliche
ergebnisse (sollte eigentlich dasselbe sein):
print (0 or 1) ? "hallo" : "huhu";
Hier wird das in Klammern stehende (0 or 1) als Argument fuer
print gewertet. Das danach folgende ist ein Return value in
void context, der -w Flag haette dir das aber auch gezeigt.
hat jemand genauere informationen?
perldoc perlop. Die perldoc ist auch auf
verfuegbar.
Gruesse,
CK
Hallo Christian,
das Verhalten erklaert sich aus dem Benutzen fehlerhafter
Beispiele :)
die beispiele habe ich extra so gewählt.
print $a = 0 || 1 ? "hallo" : "huhu";
Du meinst hier wohl '$a == 0'? Mit '$a = 0' weisst du $a
einen Wert zu, und diese Zuweisung wird fast immer 'true'
ergeben. Der -w Flag haette dir das aber auch gezeigt.
nein ich meine schon die zuweisung. als unterschied zur direktausgabe wollte ich den umweg über eine variable gehen da das ergebnis anders ist.
ersatzweise hätte ich schreiben können:
$a = 0 or 1 ? "hallo" : "huhu";
print $a
eine zuweisung ist zwar true, trotzdem ergibt der ausdruck
print $a = 'test'
ausgabe: test
und nicht etwa 1;
gruss volker