Alle Elemente von einem Array in ein anderes verschieben

25/03/2013 - 18:28 von Ying Gan | Report spam
Kann mir jemand erklàren, was im Detail beim folgendem Perl-Skript passiert? Ich verstehe auch nicht, warum das neue Array genau die umgekehrte Reihenfolge haben soll. Danke!

Hier das Skript:

while(@alt){
push @neu, pop @alt;
}
 

Lesen sie die antworten

#1 Bjoern Hoehrmann
25/03/2013 - 19:00 | Warnen spam
* Ying Gan wrote in de.comp.lang.perl.misc:
Kann mir jemand erklàren, was im Detail beim folgendem Perl-Skript
passiert? Ich verstehe auch nicht, warum das neue Array genau die
umgekehrte Reihenfolge haben soll. Danke!

Hier das Skript:

while(@alt){
push @neu, pop @alt;
}



Perl wertet Ausdrücke abhàngig davon aus, welche Art Ergebnis gewünscht
wird, siehe z.B. `perldoc -f wantarray`. Für die `while(...)` Bedingung
wird ein Wahrheitswert gewünscht. Wahrheitswerte sind Skalare Werte also
ist das in etwas sowas wie:

while(scalar(@alt)) {
push @neu, pop @alt;
}

Und scalar(@example) gibt (grob) die Anzahl der Elemente in @example zu-
rück. In Perl sind ganze Zahlen ausser der 0 "wahr", und die Bedingung
wird bei jedem Durchlauf durch die Schleife neu ausgewertet, also

solange es Elemente in @alt gibt {
push @neu, pop @alt;
}

Das Komma trennt in Perl gemeinhin Elemente in Listen voneinander, in
dem Beispiel die Liste der Argumente mit denen push() auferufen werden
soll. Verstàndlicher kann man schreiben:

push(@neu, pop @alt);

und entsprechend

push(@neu, pop(@alt));

Bevor Perl eine Fuktion aufruft, werden erst die Parameter ausgewertet,
grob vereinfacht kann man das also auch schreiben

my $argument2 = pop(@alt);
push @neu, $argument2;

`pop` merkt sich den Wert des letzten Elementes in @alt, löscht den aus
dem Array, und liefert ihn dann als Ergebnis zurück, also

my @x = (1, 2);
my $y = pop @x;

Dann ist $y der Wert `2` und @x die Liste (1). `push` fügt einen Wert an
das Ende eines Arrays an.

solange es Elemente in @alt gibt {
my $argument2 = pop(@alt);
push @neu, $argument2;
}

Der Ablauf wàre dann also sowas wie

@neu ist leer
@alt ist (1, 2)
solange (1, 2) ist wahr
$argument2 wird 2
@alt wird (1)
@neu wird (2)
solange (1) ist wahr
$argument2 wird 1
@alt wird ()
@neu wird (2, 1) # weil ans Ende angefügt wird!
solange () ist falsch

Grüsse,
Björn Höhrmann · mailto: · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Ähnliche fragen