armin: wie werden variablen evaluiert?

Hallo zusammen,

gebt mal auf der commandozeile folgendes ein:

perl -e 'print $i," ",$i++," ",$i," ",++$i," ",$i'

Als Ergebnis bekomme ich: 2 0 2 2 2

Erwartet hätte ich 0 0 1 2 2 (Evaluation von links nach rechts)
oder 0 1 1 1 2 (Evaluation von rechts nach links)
Wie kommt das tatsächliche Ergebnis zustande?

Gruss

  1. Wie kommt das tatsächliche Ergebnis zustande?

    obwohl ich kein perl-coder bin:

    das ganze wird als einzelner ausdruck interpretiert. die inkrement-operatoren werden schon vor dem ausgeben ausgeführt, $i ist also bei der ausgabe schon 2. $i++ gibt den wert vor der erhöhung zurück, also 0. ++$i gibt den wert nach der erhöhung zurück, also auch 2.

    Hoffe das genügt als Erklärung.

    Gruß,
    Niklas

    1. nachtrag:

      perl -e '$i = 0;print $i;print $i++;print $i;print ++$i;print $i;'

      bringt das erwartete ergebnis 0 0 1 2 2

      Gruß,
      Niklas

  2. Wie kommt das tatsächliche Ergebnis zustande?

    Ergänzend zu den Erläuterungen des codeslayers: Willst Du Dich wirklich in den Syntax-Tree von Perl einarbeiten? Falls ja, gib mal auf der Kommandozeile ein

    perl -MO=Concise -e "print $i,' ',$i++,' ',$i,' ',++$i,' ',$i"

    Das erzeugt sowas:

    g  <@> leave[1 ref] vKP/REFC ->(end)  
    1     <0> enter ->2  
    2     <;> nextstate(main 1 -e:1) v ->3  
    f     <@> print vK ->g  
    3        <0> pushmark s ->4  
    -        <1> ex-rv2sv sK/1 ->5  
    4           <#> gvsv[*i] s ->5  
    5        <$> const[PV " "] s ->6  
    7        <1> postinc[t3] sK/1 ->8  
    -           <1> ex-rv2sv sKRM/1 ->7  
    6              <#> gvsv[*i] s ->7  
    8        <$> const[PV " "] s ->9  
    -        <1> ex-rv2sv sK/1 ->a  
    9           <#> gvsv[*i] s ->a  
    a        <$> const[PV " "] s ->b  
    c        <1> postinc[t6] sK/1 ->d  
    -           <1> ex-rv2sv sKRM/1 ->c  
    b              <#> gvsv[*i] s ->c  
    d        <$> const[PV " "] s ->e  
    -        <1> ex-rv2sv sK/1 ->f  
    e           <#> gvsv[*i] s ->f
    

    Erklärt sind die Abkürzungen im Abschnitt Abbrevations. Ein bisschen hübscher sieht das Ganze mit

    perl -MO=Concise,-terse -e "print $i,' ',$i++,' ',$i,' ',++$i,' ',$i"

    aus. Viel Spaß beim Aufdröseln ;)

    Siechfred

    --
    Wir vom Moderatorenteam haben keinerlei Humor, von dem wir wüssten.
  3. Vielen Dank für die hilfreichen Antworten.