Hashes (Assoziative
Arrays)
Normale Arrays oder Listen erlauben den Zugriff zu den Elementen über die
Elementnummern. Das erste Element des Arrays @food ist $food[0]. Das zweite Element ist
$food[1], und so weiter. Mit Perl können aber auch Arrays erzeugt werden, deren Elemente
durch Strings referenziert werden. Diese Arrays nennt man assoziative Arrays oder hashes
(die keyword - value -Paare werden in Hash-Tabellen abgelegt.)
Um einen Hash zu definieren
verwenden wir die normale Klammer-Notation. Der Arrayname hat jedoch ein
vorangestelles %-Zeichen (im Gegensatz zum @-Zeichen des gewöhnlichen
Arrays). Wir wollen einen Hash definieren, welcher den Namen und das Alter
von Personen enthält. Das sieht folgendermassen aus:
%ages = ('Michael Caine', 39,
'Dirty Den', 34,
'Angie', 27,
'Willy', '21 in dog years',
'The Queen Mother', 108);
Beachte: In Perl V5 können die Kommas durch =>
-Operator ersetzt werden. Damit wird die Zusammengehörigkeit der Schlüssel-Wert-Paare
dokumentiert und er bewirkt, dass der Wert links des Operators als String
interpretiert wird. Obiges kann deshalb auch folgendermassen geschrieben
werden:
%ages = ('Michael Caine' => 39,
'Dirty Den' => 34,
Angie => 27,
Willy => '21 in dog years',
'The Queen Mother', 108);
Das Alter der Leute kann mit den folgenden Anweisungen gefunden werden:
$ages{'Michael Caine'}; # Ergibt 39
$ages{'Dirty Den'}; # Ergibt 34
$ages{Angie}; # Ergibt 27
$ages{Willy}; # Ergibt "21 in dog years"
$ages{'The Queen Mother'}; # Ergibt 108
Und mit
$ages{'ich'} = 'jung';
kann man beliebige weitere Elemente hinzufügen.
Das %-Zeichen wird wiederum durch ein $-Zeichen ersetzt, falls ein
einzelnes Element gemeint ist. Ein Element ist ein Skalar! Im Unterschied zu den normalen
Arrays, wo der Index in eckigen Klammern geschrieben wird, verwenden wir bei den Hashes
die geschweiften Klammern. Der Index ist ein String, eben der Name der Person.
Ein Hash kann in einen normalen Array umgewandelt werden, indem er einfach einem
normalen Array zugewiesen wird. Umgekehrt wird ein normaler Array in einen Hash
umgewandelt. Idealerweise hat der normale Array eine gerade Anzahl Elemente:
@info = %ages; # @info ist ein normaler Array.
# Er hat jetzt 10 Elemente.
$info[5]; # Das 6. Element von @info
# den Wert 27
%moreages = @info; # %moreages ist ein assoziativer
# Array. Es ist der gleiche wie %ages
Operatoren
Die Elemente von assoziative Arrays sind ungeordnet (hash-tables) aber
man kann die Elemente der Reihe nach mit den Funktionen keys
und values zugreifen:
foreach $person (keys %ages) {
print "Ich kenne das Alter von $person.\n";
}
foreach $age (values %ages) {
print "Jemand ist $age Jahre alt.\n";
}
Die Funktion keys erzeugt ein Liste der Schlüsselwörter (das sind die Indizes)
des Hash. Die Funktion values erzeugt ein Liste der Werte. Die Reihenfolge der
beiden Listen ist gleich, sie hat jedoch nichts mit der Reihenfolge der Eingabe zu tun.
In skalarem Kontext geben die Funktionen keys und values die Anzahl
key/value-Paare im assoziativen Array an.
Daneben gibt es noch eine Funktion each,
welche einen Array mit zwei Elementen erzeugt, dem Schlüsselwort und dem
Wert. Aufeinanderfolgende Aufrufe von each geben immer ein neues
key/value-Paar aus, solange solche vorhanden sind:
while (($person, $age) = each(%ages)) {
print "$person ist $age Jahre alt\n";
}
Umgebungs-Variablen
UNIX kennt das Konzept von Umgebungsvariablen, welche es erlauben, Informationen
über das System interessierten Programmen weiterzugeben. Zum Beispiel
wird in der USER-Variablen den Namen des eingeloggten Benutzers gespeichert
und in der HOME-Variablen dessen Home-Directory, usf. Perl stellt diese
Variablen in dem assoziativen Array %ENV
zur Verfügung. Die Schlüsselwörter dieses Arrays sind die Namen der Umgebungsvariablen.
Somit wird das folgende Programmstück die aktuellen Werte der Umgebungsvariablen
USER und HOME ausgeben:
print "Du bist User $ENV{'USER'} mit ";
print "Homedirectory $ENV{'HOME'}\n";
|