wie werden variablen evaluiert?
armin
- perl
0 codeslayer0 Siechfred0 Armin
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
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.