HashesPerl

Hashes bzw. assoziative Array sind so etwas ähnliches wie Arrays! Statt einer geordneten Liste, die über ihre Nummerierung angesprochen wird (also über den Zugriffsoperator - z. B. $array[3]), ist ein Hash eine Liste ohne Ordnung. Die Listenelemente werden nicht über ihre Nummerierung oder Reihenfolge oder ähnliches angesprochen, sondern über einen Schlüsselwert (Key), der aus einem String oder einer Zahl besteht. Das heißt, man sagt nicht >>ich will jetzt den Wert des zweiten Arrayelements<<, sondern >>ich will den Wert des Elements mit dem Schlüsselnamen "soundso"<<. Will man einem Hash also ein Element zuordnen, muss man ihm sagen, wie das Element (Schlüssel) heißt und welchen Inhalt das Element hat.

Bemerkung: Ein Hash existiert nur in einer oder in Zusammenahng mit einer Hashvariablen. Es kann nicht einfach allein als ein Hash dargestellt werden. Perl fasst das immer als ein Array auf.

SeitenanfangSeitenendeHashvariablen

Der Name einer Hashvariablen wird natürlich mit einem besonderen Zeichen eingeleitet: %. Der Rest setzt sich - wie gehabt - aus Buchstaben, Ziffern und dem _ zusammen, wobei das erste Zeichen nach dem % ein Buchstabe sein muss. Angesprochen wird ein Element eines Hashes über den Schlüsselwert, der in geschweiften Klammern {} nach dem Namen der Hashvariablen steht. Vor den Namen wird statt des %-Zeichens ein $ gesetzt, Perl weiß dann, dass auf ein einzelnes Element zugegriffen wird:

%hans=();   # leerer Hash hans $hans{"Alter"}=12;
  # der Inhalt von hans für den Schlüssel Alter ist 12
$hans{"Nachname"}="Schmidt";
  # der Inhalt von hans für den Schlüssel Nachname ist Schmidt
$hans{"Vorname"}="Johann";
  # der Inhalt von hans für den Schlüssel Vorname ist Johann

print $hans{"Vorname"}.' '.$hans{"Nachname"}."\n";  # Ausgabe

liefert:

Johann Schmidt

Man kann auch eine Variable als Schlüssel in den Hash einsetzen:

$schluessel="Haarfarbe";
$hans{$schluessel}="rot";

print 'Die Haarfarbe von '.
  $hans{"Vorname"}.' '.$hans{"Nachname"}.
  ' ist '.$hans{'Haarfarbe'}.".\n";

Das ergibt:

Die Haarfarbe von Johann Schmidt ist rot.

Wie schon gesagt, so etwas wie ein Hash ohne einer Hashvariablen gibt es nicht. Man kann aber einem Hash beim Initialisieren Elemente zuordnen. Dabei werden wie bei einem Array die Schlüsselwerte und Inhalte hintereinander in runden Klammern geschrieben und durch Kommatas getrennt. Obiges Beispiel könnte auch so realisiert werden:

%hans=("Nachname","Schmidt","Alter",12,"Vorname","Johann");

print $hans{"Vorname"}.' '.$hans{"Nachname"}."\n";  # Ausgabe

... und das fällt auf

Das geht auch:

@hans=("Nachname","Schmidt","Alter",12,"Vorname","Johann");
%hans=@hans;
%ichHeisseAuchHans=%hans;
@hans2=%hans;
  # Achtung: die Schlüssel werden zu Elementen von @hans.
  # Vorsicht: die Reihenfolge der Elemente in @hans
  #   ist eine andere als in @hans2
Bemerkung: Wie Perl Hashes intern abspeichert, kann man nicht beeinflussen! Deshalb ist es nicht ratsam, ein Hash einem Array zuzuordnen.

Zur besseren Anschauung für die Initialisierung einer Hashvariablen hat man einen Operator => eingeführt, der die gleiche Bedeutung wie ein Komma hat und auch nichts anderes macht, als nur anders auszusehen:

%hans = (
  Nachname => "Schmidt",
  Vorname  =>"Johann",
  Alter    => 12
);

SeitenanfangSeitenendeOperatoren

Für Hashvariablen gibt es einige nennenswerte Operatoren.

Operator Beschreibung Beispiel
keys() Liefert ein Array mit den allen Schlüsselwerten. keys(%hans)
values() Liefert ein Array aller Werte im Hash. values(%hans)
delete() Löscht das angegebene Element aus dem Hash und gibt den Wert des gelöschten Elements zurück. delete($hans{"Alter"})

Ein Beispiel:

%hans = (
  Nachname => "Schmidt",
  Vorname  => "Johann",
  Alter    => 12,
  Beruf    => "Schreinermeister"
);

@eigenschaften=values(%hans);
  # @eigenschaften enthält alle Werte aus %hans

foreach $e (keys(%hans)){
  # durchlaufe alle Schlüsselwörter
  print $e.' : '.$hans{$e}."\n";
  # Ausgabe:
  # Nachname : Schmidt
  # Vorname : Johann
  # ...
}

Seitenanfang FehlermeldungHilfe zur Fehlermeldung © 2001-2003 Email an den AutorPerl, Lehrstuhl Mathe II, Uni Bayreuth