9. Kapitel

9.1. Hashes Grundlagen

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.

9.2 Zugriffsmöglichkeiten auf Hashes

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.

keys - Zugriff auf Schlüssel

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";
  }
  

values - Zugriff auf Werte

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";
  

each - Zugriff auf Schlüssel-/Wertpaare

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


Die unbearbeitete Version hängt hinten an.

-- JoergWestphal - 02 Feb 2004

Okay, mein erster, unfertiger Entwurf für die Überarbeitung:

-- RonnieNeumann - 29 Mar 2004

Diese Version unterscheidet sich stark von dem mir vorliegenden Original, deshalb werd ich sie so belassen...
Original Kapitel: http://pronix.linuxdelta.de/Perl_cgi/Perl/perl_kurs_kapitel9.shtml

-- EnricoEhrhardt - 18 Aug 2008 Kapitelnavigation hinzugefügt ...

-- EnricoEhrhardt - 18 Aug 2008
Topic attachments
I Attachment Action Size Date Who Comment
perl_kurs_kapitel9.php.txttxt perl_kurs_kapitel9.php.txt manage 18.0 K 2004-02-02 - 20:27 JoergWestphal Das ist die Richtige!
Topic revision: 2008-08-23, HerbertBreunung
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.