ein Kapitel zurück                                           ein Kapitel weiter

Manch Programmierer werden schon mal von Hashes gehört bzw. damit zu tun gehabt haben. Hashes auch assoziatives Array genannt kann mit freidefinierbare Zeichenketten auf einzelnen Array-Elemente zugreifen. So kann man sich den Syntax von Hashes vorstellen........

%HASH = (SCHLÜSSEL => WERT);


Daran erkennt man das Hashes mit dem Zeichen % beginnen mit einem Schlüsselnamen womit wir anschließend mit Hilfe der Zeichenkette auf die einzelnen Elemente zugreifen können.

Folgende Schreibweisen können sie für Hashes verwenden....

("Montag" , 1 , "Dienstag" , 2 , "Mittwoch" , 3, "Donnerstag" , 4 ,
 "Freitag" , 5 , "Samstag" , 6 , "Sonntag" , 7)


Aufgrund der besseren Lesbarkeit empfiehlt es sich aber die Schreibweise mit => anstelle des Kommas zu verwenden. Bei dieser Schreibweise kann man auch auf das Quoting der Schlüssel verzichten...

%wochentag = (Montag => 1, Dienstag => 2, Mittwoch => 3, Donnerstag => 4,
               Freitag => 5, Samstag => 6, Sonntag => 7);


Das mit dem Quoting gilt aber nur für die Schlüssel und nicht deren Werte.

Das ganze mal in der Praxis....

#!/usr/bin/perl -w

%auto = ("Marke" => "BMW", "Baujahr" => 1999, "PS" => 113, "KFZ" => "A - BC111");

print $auto{Marke}, "\n";
print $auto{Baujahr}, "\n";
print $auto{PS}, "\n";
print $auto{KFZ}, "\n";


Sie sehen in unserem Programm oben wie wir mit Hilfe des $hash{schlüssel} auf die einzelnen Elemente zugreifen können.
WICHTIG: Der Schlüssel eines HASH muss eine Zeichenkette sein!!!
Nun ist dies Art (print) auf einzelnen Elemente eines Hashes zuzugreifen recht umständlich. Auch hier liefert uns Perl wieder eine Funktion mit der wir die einzelnen Felder es Hashes durchzulaufen.
Die Funktion lautet keys. Mit dieser Funktion bekommen wir Schlüssel in Form eines Arrays zurück. Das ganze auf unser Programm bezogen........

#!/usr/bin/perl -w

use Tie::IxHash;  #Damit die richtige Reihenfolge ausgeben wird

%auto = ("Marke" => "BMW", "Baujahr" => 1999, "PS" => 113, "KFZ" => "A - BC111")

foreach (keys %auto)
 {
   print $_ . " : " . $auto{$_} . "\n";
 }


Hiermit erzeugen wir in der foreach-Schleife den Schlüssel eines Hash. Dieser steht nun in der Standardvariablen $_ . Welcher das ist zeigt uns die print - Ausgabe. Den Wert diese Schlüssels geben wir dann mit $auto{$_} aus.

Sollten uns die Schlüssel nicht interessieren und nur die Werte der Liste können sie dies mit dem Schlüsselwort values realisieren...........

#!/usr/bin/perl -w

%auto = ("Marke" => "BMW", "Baujahr" => 1999, "PS" => 113, "KFZ" => "A - BC111")

foreach $wert (values %auto)
 {
   print $wert , "\n";
 }


Somit werden nur die Werte der Liste ausgegeben. Nun haben sie in Perl auch die Möglichkeit Schlüssel/Wert-Paare hinzuzufügen und zu Entfernen. Wir wollen in unserer Liste das Schlüssel/Wert-Paar "PS" => 113 löschen und ein Schlüssel/Wert-Paar wie "KWH" => 66 hinzufügen..........

#!/usr/bin/perl -w

#use Tie::IxHash;       #Damit die richtige Reihenfolge ausgeben wird

%auto = ("Marke" => "BMW", "Baujahr" => 1999, "PS" => 113, "KFZ" => "A - BC111");

foreach (keys %auto)
 {
   print $_ . " : " . $auto{$_} . "\n";
 }

print "\n";

delete $auto{PS};      #Wir entfernen das Schlüssel/Werte-Paar PS : 113

$auto{KWH} = 66;       #Wir fügen ein Schlüssel/Wert-Paar (KWH/66) hinzu

foreach (keys %auto)
 {
   print $_ . " : " . $auto{$_} . "\n";
 }


Um ein Schlüssel/Wert - Paar zu löschen verwenden wir einfach delete und den Schlüssel. Und um eines hinzufügen, was noch einfacher ist, schreiben wir einfache einen neuen Schlüssel vom Hashtyp %auto.

Das Hinzufügen eines neuen Wertes im Hash läßt sich noch einfacher reallisieren....

#!/usr/bin/perl -w

%auto = (Marke => "BMW", Baujahr => 1999, PS => 113, KFZ => "A - BC111");

foreach (keys %auto)
   {
     print $_ . " : " . $auto{$_} . "\n";
   }

#Wir fügen neuen Schlüssel mit Wert ein
$auto{'Preis'} = '25000 DM';
print "\n\n";

foreach (keys %auto)
   {
     print $_ . " : " . $auto{$_} . "\n";
   }


Wenn sie nur den Wert eines Schlüssels löschen wollen können sie dies mit undef machen...

#!/usr/bin/perl -w

%auto = (Marke => "BMW", Baujahr => 1999, PS => 113, KFZ => "A - BC111");

foreach (keys %auto)
   {
     print $_ . " : " . $auto{$_} . "\n";
   }

#Wir entfernen den Wert von KFZ.....
undef $auto{KFZ};
print "\n\n";

foreach (keys %auto)
   {
     print $_ . " : ";
     print $auto{$_} if defined $auto{$_};
     print "\n";
   }


Es empfiehlt sich auch immer den Wert mittels defined zu überprüfen ob vorhanden. Ob ein Schlüssel überhaupt existiert können sie mit exists überprüfen......

foreach (keys %auto)
   {
     print $_ . " : " if exists $auto{$_} ;
     print $auto{$_} if defined $auto{$_};
     print "\n";
   }


Mit der Funktion each() können wir ähnlich der foreach Schleife alle Schlüssel-Werte-Paare durchlaufen. Sind keine Paare mehr vorhanden liefert each false zurück...

#!/usr/bin/perl -w

%auto = (Marke => "BMW", Baujahr => 1999, PS => 113, KFZ => "A - BC111");

while( ($schluessel, $wert) = each %auto){
   print $schluessel . " : " . $wert . "\n";
  }


Zum Schluss sollten noch einige Punkte erwähnt werden wofür sich Hashes besonders gut eignen...

  • Häufigkeitsermittlung - Ein Schlüssel bekommt einen String und den passenden Wert der die Häufigkeit des Vorkommens zählt.
  • Reallisierung von Mengen
  • komplexe Sortieroperationen
  • benannte Subroutinenparameter
  • Multihashes

Als letztes Beispiel wollen wir uns das Programm zu Feststellung der Wörterhäufigkeit ansehen.....

#!/usr/bin/perl -w

#Text anhand Whitespace aufteilen
while(defined($zeile=<>)){
   chomp $zeile;
   my @word = split( m/\s/, $zeile);

  foreach (@word){
     s/\W/ /g; #nichtwortzeichen in $_ entfernen
     next if $_ eq ' ';
     $hash{$_}++; #Wert um eins erhöhen
  }
 }

foreach(sort { $hash{$b} <=> $hash{$a} } keys %hash){
    print "$_ -> $hash{$_}\n";
  }


Entscheident in diesem Programm ist die Zeile...

$hash{$_}++    


Ist der Schlüssel nicht vorhanden wird er neu erstellt und der Wert wird um 1 inkrementiert. Ist der Schlüssel vorhanden wird nur der Wert um 1 inkrementiert. Wir geben die Worthäufigkeit sortiert nach Menge absteigend aus.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf