Hashes unterscheiden sich von Array durch die Art des Zugriffs. Auf die Elemente im Array wird über einen Index zugegriffen der die Position des Elementes im Array angibt. Auf die Elemente eines Hashes wird über einen eindeutigen frei wählbaren Bezeichner zugegriffen, weshalb Hashes auch als assoziative Arrays oder Dictionaries bezeichnet werden.
my %hash = ( 'bezeichner' => 'element' ); # empfohlene Schreibweise my %hash = ( 'bezeichner' , 'element' ); # alternative Schreibweise
Der Hash wird mit einem %-Prozentzeichen deklariert. Jedes Element wird durch einen eindeutigen Bezeichner identifiziert, welcher auch als key oder Schlüssel bezeichnet wird. Die Elemente des Hashes bezeichnen wir als values oder Werte. Der Pfeil => oder das Komma können beide zur Trennung von Schlüssel und Wert verwendet werden. Die Verwendung des Pfeils ist aber empfehlenswert, wegen der Übersichtlichkeit, wenn ein größerer Hash definiert werden soll.
my %wochentage = ( 'Montag' => 1,
'Dienstag' => 2,
'Mittwoch' => 3,
'Donnerstag' => 4,
'Freitag' => 5,
'Samstag' => 6,
'Freitag' => 7, );
Der Zugriff auf einzelne Werte in einem Hash erfolgt in einem skalaren Kontext, das heißt der Zugriff erfolgt wie bei einen einfachen Skalar mit einem vorangestellten $-Dollarzeichen, was zu Anfang sehr verwirrend sein kann.
#!/usr/bin/perl
use strict;
use warnings;
my %auto = ( 'Marke' => 'BMW',
'Baujahr' => 1999,
'PS' => 113,
'Kennzeichen' => 'A - BC111');
$auto{'Preis'} = 'unbezahlbar'; # Ein neues Schlüssel/Wert-Paar anlegen
print $auto{'Marke'}, "\n"; # Wert zu Schlüssel 'Marke' ausgeben.
print $auto{'Baujahr'}, "\n";
print $auto{'PS'}, "\n";
print $auto{'Kennzeichen'}, "\n";
print $auto{'Preis'}, "\n";
Im obigen Beispiel sieht man wie der Zugriff auf einzelne Elemente des
Hashes möglich ist und wie per Zuweisung neue Schlüssel/Wert-Paare
entstehen. Der Programmierer muss sich, wie immer in Perl, keine Gedanken
um die Zuweisung von Speicher für den wachsenden Hash machen.
Natürlich erleichtert Perl den Zugriff auf alle Schlüssel und Werte des Hashes mit eingebauten Funktionen. Zu beachten ist das Perl dem Hash intern eine eigene, für Perl optimierte, Reihenfolge der Schlüssel-/Wertpaare gibt. Als vereinfachendes Beispiel mag man sich ein einreihiges Gewürzregal vorstellen, in dem Gewürzdosen stehen. Der Zugriff auf die Gewürze (Werte) erfolgt über das Ettiket (Schlüssel), egal wie die Gewürze im Regal angeordnet sind. Wenn man also nicht gezielt auf ein Element zugreift, sondern alle der Reihe nach abarbeitet, entscheidet Perl in welcher Reihenfolge dies geschieht. Selbstverständlich gibt es die Möglichkeit eine bestimmte Reihenfolge der Elemente eines Hashes zu erzwingen (auf Kosten der Geschwindigkeit), auf die später noch eingegangen wird.
Die in Perl integrierte Funktion keys liefert ein Liste aller Schluessel in einem Hash. Diese Liste kann einem Array zugewiesen werden, oder verwendet um über alle Elemente des Hashes zu iterieren.
#!/usr/bin/perl
use strict;
use warnings;
my %auto = ( 'Marke' => 'BMW',
'Baujahr' => 1999,
'PS' => 113,
'Kennzeichen' => 'A - BC111');
#my @schluessel = keys %auto; # Zuweisung aller Schlüssel an ein Array.
foreach my $schluessel (keys %auto) {
print $schluessel, "\t" x 2, $auto{$schluessel}, "\n";
}
Mit der Fuktion values ermöglicht Perl den Zugriff auf eine Liste aller Werte in einem Hash.
#!/usr/bin/perl
use strict;
use warnings;
my %auto = ( 'Marke' => 'BMW',
'Baujahr' => 1999,
'PS' => 113,
'Kennzeichen' => 'A - BC111');
print join("\t", keys %auto), "\n";
print join("\t", values %auto), "\n";
Benötigt man Zugriff auf alle Schluessel und Werte des Hashes kann man die Funktion each verwenden. In einer while-Schleife können so alle Schlüssel-/Wertpaare abgefragt werden, da each wenn alle Elemente abgearbeitet sind den Wert undef zurückliefert d.h. die Schleife wird beendet.
#!/usr/bin/perl
use strict;
use warnings;
my %auto = ( 'Marke' => 'BMW',
'Baujahr' => 1999,
'PS' => 113,
'Kennzeichen' => 'A - BC111');
while ( my ( $schluessel, $wert ) = each %auto ) {
print $schluessel, "\t", $wert, "\n";
}
Zurück zu Kapitel 8 | Zur Übersicht | Weiter zu Kapitel 10
| I | Attachment | Action | Size | Date | Who | Comment |
|---|---|---|---|---|---|---|
| |
perl_kurs_kapitel9.php.txt | manage | 18.0 K | 2004-02-02 - 20:27 | JoergWestphal | Das ist die Richtige! |