Volker: "||" und "or" nicht dasselbe!?!

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

  1. 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

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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

  2. 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

    http://www.perldoc.com/

    verfuegbar.

    Gruesse,
     CK

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    1. 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