SELFHTML

Hashes (Variablen)

Informationsseite

nach unten Hashes deklarieren und Werte zuweisen
nach unten Auf einzelne Schl�ssel und Werte zugreifen
nach unten Funktionen und Operationen zum Manipulieren von Hashes

 nach unten 

Hashes deklarieren und Werte zuweisen

Gew�hnliche Seite 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.

Beispiel eines vollst�ndigen CGI-Scripts:

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

Erl�uterung:

Im Beispiel werden zwei Hashes namens %Daten und %bessereDaten deklariert. "Deklaration" bedeutet bei Hashes das gleiche wie bei Seite 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 Seite 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.

Beachten Sie:

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.

nach obennach unten

Auf einzelne Schl�ssel und Werte zugreifen

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.

Beispiel eines vollst�ndigen CGI-Scripts:

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

Erl�uterung:

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.

Beachten Sie:

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 Seite Namensvergabe gen�gt, d�rfen die Anf�hrungszeichen entfallen.

nach obennach unten

Funktionen und Operationen zum Manipulieren von Hashes

Viele Perl-Funktionen gelten f�r Seite 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 Seite keys verwenden. Anschlie�end haben Sie eine Seite 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 Seite 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 Seite 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 Seite Hashes und Schleifen.

Anzahl Schl�ssel-Wert-Paare eines Hashs ermitteln:
Dies k�nnen Sie ebenfalls �ber die Funktion Seite 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.

 nach oben
weiter Seite Referenzen bzw. Zeiger (Variablen)
zur�ck Seite Listen bzw. Arrays (Variablen)
 

© 2007 Seite Impressum