GUI mit Perl/Tk

Tutorial

Array-Variablen

Eine weitere Art von Variablen sind die Array-Variablen. Sie stellen eine Liste von skalaren Variablen dar (z.B. Zahlen und Strings). Die Namen von Array-Variablen haben dasselbe Format, wie die skalaren Variablen, außer dass sie anstelle eines $-Symbols, am Anfang ein @-Symbol brauchen. Beispiel:

@food  = ('apples', 'pears', 'eels');
@music = ('whistle', 'flute');

Damit werden der Variablen @food eine Liste von drei Elementen, der Liste @music eine Liste von zwei Elementen zugewiesen.

Die Array-Elemente werden mittels Indizes in eckigen Klammern zugegriffen. Der Index beginnt bei 0. Der Wert von

$food[2]

ist somit eels. Beachte, dass bei $food[2] nicht mehr @, sondern $ am Anfang des Variablennamens steht. Ein Element eines Arrays ist ein Skalar!

Array Zuweisung

Wie alles in Perl kann der gleiche Ausdruck in unterschiedlichem Kontext ein anderes Resultat erzeugen. Die erste Zuweisung unten ergänzt den Array @music. Somit sind beide Zuweisungen äquivalent.

@moremusic = ('organ', @music, 'harp');
@moremusic = ('organ', 'whistle', 'flute', 'harp');

Damit können Elemente zu einem Array hinzugefügt werden. Ein anderer, eher typischer Weg, um Elemente hinzuzufügen, sieht folgendermaßen aus:

push(@food, 'eggs');

Damit wird das Element eggs ans Ende des Arrays @food angehängt. Man kann auch mehrere Elemente auf's Mal anhängen:

push(@food, 'eggs', 'lard');
push(@food, ('eggs', 'lard'));
push(@food, @morefood);

Die push-Funktion hat als Rückgabewert die neue Länge des Arrays.

Analog kann mit pop das letzte Element von einer Liste entfernt werden. pop entfernt von der ursprünglichen Liste @food das letzte Element eels. Der Rückgabewert ist das entfernte Element. @food hat nun noch zwei Elemente:

$grub = pop(@food);     # Jetzt ist $grub = 'eels' (grub=Frass)

Es ist auch möglich, einem Array eine skalare Variable zuzuordnen. Wie immer ist der Kontext wichtig. Die Zeile

$f = @food;

weist $f die Länge des Arrays $food zu. Hingegen wird mit

$f = "@food";

die Liste in einen String konvertiert, welcher zwischen den Elementen je ein Leerzeichen hat. Mit der Spezialvariablen $" kann das Leerzeichen durch einen beliebigen anderen String ersetzt werden. Diese Variable ist eine von vielen Spezialvariablen, mit welchen das Verhalten von Perl gesteuert werden kann.

Arrays können auch verwendet werden, um gleichzeitig mehrere Zuordnungen von skalaren Variablen zu machen:

($a, $b) = ($c, $d);            # Äquivalent zu $a=$c; $b=$d;
($a, $b) = @food;               # $a und $b sind die ersten
                                # beiden Elemente von @food.
($a, @somefood) = @food;        # $a ist das erste Element von @food
                                # @somefood sind die übrigen
(@somefood, $a) = @food;        # @somefood ist @food und
                                # $a ist nicht definiert.

Zur letzten Zuweisung ist anzumerken, dass Arrays alle Elemente, die sie bei einer Zuweisung antreffen, kopieren werden. Damit ist diese letzte Form nicht sehr nützlich.

Zum Schluss möchten wir noch die Länge eines Arrays bestimmen können. Der Ausdruck

$#food

ergibt den Index des letzten Elementes eines Arrays.

Achtung: Der Index eines Arrays beginnt standardmäßig mit 0. Um die Länge es Arrays in einer Variable zu speichern, schreibt man deshalb:

$len = $#food + 1; # Index des letzten Elements + 1 = Länge

Eine gängige und etwas lesbarere Variante zur Ermittlung der Länge es eines Arrays ist die Verwendung der Standardfunktion scalar:

my $length = scalar(@food);

Die Funktion scalar setzt eine Variable in den Skalaren Kontext. scalar(@food) und "@food" aus dem Beispiel etwas weiter oben bewrirken das Gleiche: Die Länge des Arrays wird zurückgegeben.

Achtung Fallstrick: Perl kennt auch eine Funktion namens length. length(@food) gibt jedoch nicht die Länge des Arrays zurück, sondern die Länge der Zahl, die die Länge des Arrays beziffert. Deshalb bitte merken: Die Länge eines Arrays bestimmt man mit scalar(@array).

Arrays ausgeben

Weil der Kontext wichtig ist, ist es nicht erstaunlich, dass die folgenden Ausdrücke alle unterschiedliche Resultate erzeugen:

print @food;    # 
print "@food";  # mit doppelten Anführungszeichen
print @food . ""; # in skalarem Kontext (. ist die Konkatenation)

Übung

#!perl
use strict;
use warnings;

my @food = ('Apfel', 'Birne'); # erste Verwendung mit 'my'
push(@food, ('Eier', 'Schmalz'));

pop @food;

print @food;    # 
print "@food";  # mit doppelten Anführungszeichen
print @food . ""; # in skalarem Kontext (. ist die Konkatenation)

Wir probieren die obigen print-Statements aus und schauen, was dabei herauskommt. Man darf es sich auch vorher überlegen!

Top