Normale Arrays oder Listen erlauben den Zugriff zu den Elementen über die Elementnummer. 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 assoziativen Array 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 Array 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 => ersetzt werden. Daneben bewirkt er, 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
Beachte, dass das %-Zeichen wiederum durch das $-Zeichen ersetzt wird um ein einzelnes Element zu bezeichnen, ein Element ist ein Skalar! Im Unterschied zu den normalen Arrays, wo der Index in eckigen Klammern geschrieben wird, verwenden wir bei den assoziativen Arrays die geschweiften Klammern, der Index ist ein String, eben der Name der Person.
Ein assoziativer Array kann in einen normalen Array umgewandelt werden, indem er einfach einem normalen Array zugewiesen wird. Umgekehrt wird ein normaler Array in einen assoziativen Array 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
assoziativen Arrays. Die Funktion values erzeugt ein
Liste der Werte des assoziativen Arrays. 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. Aufeineanderfolgende 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";
}
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";