icancode.de

Perl

Perl Crashkurs – Listen und Arrays

Veröffentlicht am .

Perl Crashkurs – Listen und Arrays

Einleitung

Listen

Wie im ersten Teil schon beschrieben, kennt Perl drei Arten von Variablen: Skalare, Arrays und Hashes. Wer jetzt die Überschrift richtig gelesen hat, der sollte sich Fragen, was Listen sind, wenn nicht Variablen.

($h, $w) = ("look", "a", "list");
print "H: ". $h . " W: " . $w . "\n";

# H: look W: a

Was mit "list" passiert ist? Keine Ahnung. Scheinbar ist es unterwegs vom Laster gefallen. Das Ziel-Tupel hat nur 2 Werte, also wird der dritte Wert der Eingabe einfach ignoriert.

($h, $w) = ("hello");
print "H: ". $h . " W: " . $w . "\n";

# H: hello W:

Andere Programmiersprachen würden hier einen Fehler werfen. Nicht so Perl. Die zugewiesene Liste wird einfach um ein leeres Element erweitert. Passt schon.

$h = ("Look", "at", "this", "awesome", "list");
print "H: ". $h . "\n";

# H: list


Wie ist das denn jetzt passiert? $h wurde einfach überschrieben. Aber wir haben die Liste doch einer Variable zugewiesen. Falsch. Wir haben die Liste einem Skalar zugewiesen und Skalare sind eben keine Listen. Anders formuliert, existieren im skalaren Kontext keine Listen. Im oben gezeigten Fall ist , ein Operator, der das nächste Skalar ausgibt. Ganz großes Kino…

Oh übrigens ( ) sind auch eher so schönes Beiwerk.

my @array = (("a",9), ("x","y"), ("y","x"));
# (a,9,x,y,y,x)

Arrays

Im Gegensatz zu Listen sind Arrays in Perl Variablen. Sie sind mutabel und können benannt werden. Dazu werden sie mit einem @ Versehen.

Einer der Punkte, warum Listen und Arrays in Perl vielen Menschen das Leben schwer machen ist, dass Arrays oft mit Listen initialisiert werden.

my @array1 = (10..22);
print @array1."\n";
#1011121314151617181920

my @array2 = ('aa'..'bb');
print @array2."\n";
#aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazbabb

Perl ist nicht typisiert. Ergo sind auch Arrays nicht typisiert. Sie müssen also nicht nur einen Typ von Variablen enthalten, sondern können bunt gemixt sein.

my @array = (1, 2.0, "x", 'y');
#1,2,x,y

Ordentliche Ausgabe

Wie im letzten Beispiel gut zu sehen ist, muss der Output von Arrays ein wenig gestyled werden, um ordentlich lesbar zu sein. Dafür wird join verwendet.

print join(", ", @array1)."\n";
#10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20

Länge des Arrays

Bei Arrays benutzt man jetzt nicht length um die Länge zu bestimmen, sondern scalar. Alternativ kann man das Array auch einfach in einen Skalar ablegen. Geht halt schneller.

$count = @array;
print "Anzahl: $count \n";
#Anzahl: 11

print "Anzahl: ".scalar(@array)."\n";
#Anzahl: 11

Picard WTFDer Fairness halber sei erwähnt, dass es im Grunde eine Art cast ist, dennoch verwirrend. Das Array direkt als Skalar ausgeben funktioniert dann übrigens nicht:

print "Array: $array";
# Array: 

Einzelne Elemente

Einzelne Elemente eines Arrays auszulesen scheint auf den ersten Blick ziemlich einleuchtend. Schließlich hält sich Perl dabei an das, was alle anderen Sprachen tun. Oder doch nicht?

my @array = (1,2,3);
$element = $array[0];

Einzelne Elemente sind wieder Skalare, werden also mit einem $ gekennzeichnet und nicht mit dem @ des Arrays – wäre ja auch viel zu übersichtlich…

Stackoperationen

Arrays können auch als Stack behandelt werden. Das mag nicht immer sinnvoll erscheinen, kann aber ziemlich praktisch sein. Grundlegend gibt es vier Operationen: push, pop, shift und unshift.

Die ersten beiden sind ziemlich logisch. push hängt irgendetwas an ein Array dran und pop holt es wieder runter.

my @stack = (1,2,3);

push(@stack, "x");
# (1,2,3,"x")

pop(@stack);
# (1,2,3)

Mit shift und unshift kann das ganze Array nach links bzw. rechts verschoben werden.

my @stack = (1,2,3);
# (1,2,3)
my $element = shift(@stack);
#@stack: (2,3)
#$element = 1

unshift(@stack, "x", "x");
#@stack: ("x", "x", 2, 3)

* Die Memes mussten leider einfach sein. ;)

Rico Magnucki

Rico Magnucki

http://magnucki.de

21st Century Digital Boy und Blog-Gründer. Studiert naturwissenschaftliche Informatik in Bielefeld. Auf dem Blog ist er der Ansprechpartner für LaTeX, schreibt Tutorials, dreht die Videos für YouTube und durchforstet das Internetz nach spannenden Dingen.

Navigation