wie werden variablen evaluiert?
    
armin
    
    
      
    
  - perl
- 0 codeslayer
- 0 Siechfred
- 0 Armin
 nicht angemeldet
 nicht angemeldetHallo 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
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
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
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
Vielen Dank für die hilfreichen Antworten.