Gew�hnliche Listen bzw. Arrays bestehen aus einer Reihe von Werten, die �ber Indexnummern, beginnend bei 0, ansprechbar sind. So ist das 8. Element eines Arrays mit dem Namen
@Listenname
�ber $Listenname[7]
ansprechbar. Ein assoziativer Array, in Perl als Hash bezeichnet, speichert dagegen pro Element zwei Werte: einen Namen und einen Wert. Werte innerhalb eines Hashs werden dann nicht �ber Indexnummern angesprochen, sondern �ber den zugeh�rigen Namen "assoziiert". Der Name wird daher auch als "Schl�ssel" bezeichnet. �ber den Schl�ssel ist der Zugriff auf die damit verkn�pften Daten m�glich.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my %Daten = ("Name","Jana","Alter",23,"Ort","Berlin"); my %bessereDaten = (Name => "Jana", Alter => 23, Ort => "Berlin"); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Testausgabe</title>\n"; print "</head><body>\n"; print "<pre>",%Daten,"</pre>\n"; print "<pre>",%bessereDaten,"</pre>\n"; print "</body></html>\n";
Im Beispiel werden zwei Hashes namens %Daten
und %bessereDaten
deklariert. "Deklaration" bedeutet bei Hashes das gleiche wie bei Arrays. Ein Hash wird durch das Prozentzeichen
%
eingeleitet. Dahinter folgt der Name des Hashes. Bei der Deklaration eines Hashes k�nnen Sie Anfangswerte zuweisen oder auch nicht. In beiden obigen Beispielen werden Anfangswerte zugewiesen. Dabei gibt es zwei unterschiedliche Notationsweisen, von denen diejenige, die bei %bessereDaten
angewendet wird, die �bersichtlichere und daher empfehlenswertere ist. Sie k�nnen die Werte wie im ersten Hash gezeigt notieren. Dabei wird wie in einer Liste alles durch Kommata getrennt. Das erste, dritte, f�nfte usw. Element bezeichnet jedoch einen Namen, und das zweite, vierte, sechste usw. Element den zugeh�rigen Wert. In der empfehlenswerteren Notation kommt dies besser zum Ausdruck. Dabei werden die Namen-Wert-Paare durch den Zeigeoperator =>
(der hier ein Synonym f�r das Komma darstellt, weshalb er auch als fat comma bezeichnet wird) getrennt, und Kommata werden nur zwischen den Paaren notiert. Bei der Notationsweise mit dem Operator =>
d�rfen die Anf�hrungszeichen bei den Namen, also den Schl�sseln, entfallen, wenn sie den Regeln der Namensvergabe gen�gen. Bei der anderen Notation mit Komma-Trennung zwischen Schl�ssel und Wert sind die Anf�hrungszeichen dagegen auch bei den Schl�sseln Pflicht. Die beiden Beispiel-Hashes zeigen diesen Unterschied.
Wie bei Skalaren und Listen k�nnen Sie leere Hashes deklarieren. Eine Anweisung wie my %Daten;
deklariert einen Hash, der jedoch zun�chst leer ist.
Wie Listen k�nnen auch Hashes bei den eigentlichen Werten nur Skalare enthalten, also Zeichenketten und Referenzen, die Sie auch hier beliebig mischen k�nnen. Im obigen Beispiel sind die Einzelwerte Jana
und Berlin
Zeichenketten, w�hrend 23
eine Zahl ist.
Das Beispiel gibt einfach die beiden Hash-Inhalte aus.
Skalare, Listen und Hashes haben unterschiedliche Namensr�ume. Variablen wie $name
, @name
und %name
k�nnen also problemlos im gleichen Script vorkommen.
Komplette Hashes, also mit dem Prozentzeichen beginnend, werden innerhalb von Anf�hrungszeichen in print
-Anweisungen nicht interpretiert. Um einen Hash komplett auszugeben, so wie im obigen Beispiel, m�ssen Sie die Technik nutzen, mehrere Einzelwerte mit print
auszugeben, die durch Kommata getrennt sind, wie im obigen Beispiel gezeigt.
Anstelle von konstanten Daten k�nnen Sie auch andere Variablen in einen Hash einf�gen. Zum Beispiel:
my $Alter = 23;
my %Daten = (Name => "Jana", Alter => $Alter);
Hashes lassen sich im Zusammenhang mit CGI-Scripts sehr sinnvoll einsetzen. So ist es beispielsweise m�glich, den Datenstrom eines vom Anwender ausgef�llten HTML-Formulars in einen Hash einzulesen, wobei als Hash-Schl�ssel jeweils der Feldname des Formularelements gespeichert wird und als Wert der Wert, den der Anwender in dem betreffenden Formularelement eingegeben oder ausgew�hlt hat.
Genau wie bei Listen greifen Sie auf einen Skalar zu, wenn Sie einzelne gespeicherte Werte eines Hashes auslesen oder ihnen Werte zuweisen. Zum Zugriff verwenden Sie den Schl�ssel.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my %Daten = (Name => "Jana", Alter => 23, Ort => "Berlin", Bildung => "Abitur"); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Testausgabe</title>\n"; print "</head><body>\n"; print "$Daten{'Name'} ist $Daten{'Alter'} Jahre alt, wohnt in $Daten{'Ort'} und hat $Daten{'Bildung'}\n"; print "</body></html>\n";
Im Script wird wieder der Hash %Daten
deklariert und mit vier Werten initialisiert (diesmal gleich in der besseren Notationsweise). Das Script erzeugt wieder HTML-Code und gibt darin die Daten aus. Diesmal wird dabei jedoch auf die einzelnen Werte des Hashes %Daten
zugegriffen. Mit $Daten{'Name'}
wird auf jenes Element des Hashes zugegriffen, das den Schl�ssel Name
hat. Das wie vielte Element im Hash dies ist, brauchen Sie nicht zu wissen. Es gen�gt, den Schl�ssel anzugeben. Damit wird auf den entsprechenden Wert zugegriffen. $Daten{'Name'}
greift im Beispiel also auf den Wert Jana
zu. Wichtig ist, dass der Schl�ssel in geschweiften Klammern stehen muss. Die Klammern geh�ren in diesem Kontext (innerhalb von Zeichenketten) zum Variablennamen und m�ssen direkt hinter dem Namen des Hashes notiert werden (kein Leerraum erlaubt).
Die Syntax wie in $Daten{'Name'}
zeigt mit dem voranstehenden Dollarzeichen, dass es sich bei einem Hash-Wert um einen Skalar handelt.
Anstelle von $Daten{'Name'}
k�nnen Sie auch $Daten{Name}
notieren, also ohne Anf�hrungszeichen. Solange in den geschweiften Klammern nichts weiter steht als ein einzelner Schl�ssel, der den Regeln der Namensvergabe gen�gt, d�rfen die Anf�hrungszeichen entfallen.
Viele Perl-Funktionen gelten f�r Listen und Hashes, einige davon aber auch nur f�r Hashes, da das Manipulieren von Hashes einige Besonderheiten aufweist. Ein paar wichtige M�glichkeiten sollen hier mit Verweisen auf die Beschreibung der jeweiligen Funktionen genannt werden.
Mit unbekannten Schl�sseln arbeiten:
Wenn Sie einen Hash mit Werten initialisieren, kennen Sie nat�rlich auch die Schl�sselnamen. Aber wenn Sie Daten einlesen - etwa HTML-Formulardaten in einem CGI-Script - dann wissen Sie oft nicht, was in einem Hash, der die Daten aufgenommen hat, alles drinsteht. Um sich erst einmal einen �berblick zu verschaffen, welche Schl�ssel eines Hashs eingelesen wurden, k�nnen Sie die Funktion keys verwenden. Anschlie�end haben Sie eine
Liste mit allen Namen bzw. Schl�sseln des Hashes. Angenommen, Sie haben einen Hash
%Daten
mit Schl�sseln und Werten, die Ihnen zun�chst nicht bekannt sind. Dann k�nnen Sie mit einer Anweisung wie @Schluessel = keys(%Daten);
die Schl�ssel ermitteln. Anschlie�end k�nnen Sie beispielsweise �ber $Daten{$Schluessel[0]}
auf den Wert des Hashes zugreifen, der mit dem Namen assoziiert wird, der nun in $Schluessel[0]
zu finden ist, ohne den Schl�ssel explizit zu kennen.
Werte �ndern oder hinzuf�gen:
Durch eine Anweisung wie $Daten{Vorname} = "Oliver";
weisen Sie innerhalb des Hashes %Daten
dem Element mit dem Schl�ssel Vorname
einen Wert zu. Falls bereits ein Schl�ssel Vorname
in dem Hash existiert, wird dessen bisher gespeicherter Wert durch den neu zugewiesenen Wert ersetzt. Wenn der Schl�ssel dagegen noch nicht existiert, wird das Schl�ssel-Wert-Paar einfach neu in den Hash aufgenommen. �ndern geht also, indem man einem vorhandenen Schl�ssel einen Wert zuweist, und Hinzuf�gen, indem man einem noch nicht vorhandenen Schl�ssel einen Wert zuweist.
Schl�ssel-Wert-Paar l�schen:
Zum L�schen eines kompletten Schl�ssel-Wert-Paares bietet Perl die Funktion delete an.
Kompletten Hash l�schen:
Zum L�schen aller bisher verwendeten Schl�ssel-Wert-Paare initialisieren Sie einfach den Hash neu mit leerem Inhalt: %Daten = ()
.
Hash-Werte der Reihe nach abarbeiten und sortieren:
Hashes werden intern in einer Datenstruktur gespeichert, die f�r Effizienz bei Schreib- und Lesezugriffen sorgt. Aufgrund dieser Tatsache ist die Reihenfolge der Schl�ssel, wie sie beispielsweise von der Funktion keys geliefert wird, (scheinbar) mehr oder weniger zuf�llig und stimmt nur in den seltensten F�llen mit der Reihenfolge �berein, in der Sie den Hash deklariert haben. Sie haben keine M�glichkeit, diese Reihenfolge zu ver�ndern. Es h�lt Sie allerdings niemand davon ab, die Hash-Elemente in einer bestimmten Reihenfolge beispielsweise mit einer Schleife zu durchlaufen. So k�nnen Sie z.B. mit
@sortierteSchluessel = sort keys %Daten
die Schl�ssel des Hashes %Daten
alphabetisch sortieren und diese sortierte Liste von Schl�sseln dem Array @sortierteSchluessel
zuweisen. So eine sortierte Liste von Schl�sseln k�nnen Sie anschlie�end (beispielsweise mit einer Schleife) benutzen, um die einzelnen Hash-Elemente in eben dieser sortierten Reihenfolge zu verarbeiten. Dabei k�nnen Sie wahlweise nach Schl�sseln oder nach Werten sortieren. Dazu m�ssen Sie allerdings ein paar Perl-Funktionen sowie eine Schleife anwenden. Im Abschnitt �ber Schleifen finden Sie eine Beschreibung zum Thema Hashes und Schleifen.
Anzahl Schl�ssel-Wert-Paare eines Hashs ermitteln:
Dies k�nnen Sie ebenfalls �ber die Funktion keys l�sen. Mit einer Anweisung wie
$Anzahl = keys(%Daten);
speichern Sie im Skalar $Anzahl
die Anzahl der in %Daten
vorhandenen Schl�ssel und damit der Schl�ssel-Wert-Paare. Denn die Funktion keys
gibt, wenn sie im skalaren Kontext aufgerufen wird, die Anzahl der Schl�ssel zur�ck.
![]() | |
![]() |
![]() |
![]() |
![]() |
![]() ![]() ![]() |
© 2007 Impressum