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 dabei in Hash-Tabellen abgelegt.
Um einen Hash zu definieren verwenden wir die normale Klammer-Notation. Der Variablenname hat jedoch ein vorangestelles %
-Zeichen
(im Gegensatz zum @
-Zeichen des gewöhnlichen Arrays).
Wir wollen einen Hash definieren, der 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,
);
Hinweis: Statt des =>
-Operators kann man auch Kommata verwenden.
Allerdings wird durch den =>
-Operator die Zusammengehörigkeit der Schlüssel-Wert-Paare dokumentiert und er bewirkt, dass der Wert links des Operators als String interpretiert wird.
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 5. Element von @info
# den Wert 27
%moreages = @info; # %moreages ist ein assoziativer
# Array. Es ist der gleiche wie %ages
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
, die 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 ( my ($person, $age) = each(%ages) )
{
print "$person ist $age Jahre alt\n";
}
Betriebssysteme stellen Umgebungsvariablen bereit, die es erlauben, Informationen über das System an Programme weiterzugeben. Die Namen von Umgebungsvariablen sind leider betriebssystemabhängig.
Auf Linux zum Beispiel wird in der USER
-Variablen den Namen des eingeloggten Benutzers gespeichert und in der HOME
-Variablen dessen Home-Directory, usw.
Perl stellt diese Variablen in dem assoziativen Array (Hash) %ENV
zur Verfügung.
Die Schlüsselwörter dieses Hashes sind die Namen der Umgebungsvariablen.
Somit wird das nachfolgende Programmstück die aktuellen Werte der Umgebungsvariablen USER
und HOME
ausgeben:
print "Du bist User $ENV{'USER'} mit ";
print "Homedirectory $ENV{'HOME'}\n";
Windows hat das auch, die Umgebungsvariablen heißen nur anders:
print "Du bist User $ENV{'USERNAME'} mit ";
print "Homedirectory $ENV{'HOMEPATH'}\n";