Login


 
Newsletter
Werbung

Sa, 31. Juli 1999, 00:00

Perl/CGI-Workshop, Teil 11

Hashes

Hashes (assoziative Arrays) sind ein recht mächtiges und in Perl oft verwendetes Sprachmittel. Man kann ein Hash mit einer zweispaltigen Tabelle vergleichen, bei der man anhand der Werte in der ersten Spalte ("Schlüssel") auf die Werte aus der zweiten zugreifen kann. Wir wollen beispielsweise die folgende Tabelle in einem Hash speichern:

SchlüsselWerte
AdaIchbiah
CKernighan & Ritchie
C++Stroustrup
EiffelMeyer
PascalWirth
PerlWall

Der Names eines Hashes beginnt mit einem "%". Wenn man auf ein einzelnes Element zugreift, wird wie bei Arrays auch das "$"-Zeichen verwendet. Unser Programm könnte etwa so aussehen:

<em>#!/usr/bin/perl</em>
<em># hash1.pl -- by W. Jährling</em>
$inventors{'Ada'} = "Ichbiah";
$inventors{'C'} = "Kernighan & Ritchie";
<em># ...</em>
$inventors{'Perl'} = "Wall";
<em># ...</em>

Aber mal im Ernst: Würden Sie irgendetwas so initialisieren? Nein? Ich auch nicht. Man kann ein Hash zum Glück auch einfacher initialisieren:

<em>#!/usr/bin/perl</em>
<em># hash2.pl -- by W. Jährling</em>
%inventors = (
 "Ada", "Ichbiah",
 "C", "Kernighan & Ritchie",
 <em># ...</em>
 "Perl", "Wall"
);
<em># ...</em>

Gefällt Ihnen das besser? Ja? Gut! Aber warum gucken Sie dann so komisch? Sie finden es störend, dass da überall Kommata dazwischen stehen? Ich kann Sie ja verstehen! Also gut, machen wir es jetzt ganz ordentlich:

<em>#!/usr/bin/perl</em>
<em># hash3.pl -- by W. Jährling</em>
<em># Statt dem Komma kann man auch das "=>" verwenden:</em>
%inventors = (
 "Ada" => "Ichbiah",
 "C" => "Kernighan & Ritchie",
 <em># ...</em>
 "Perl" => "Wall"
);
print "Nenne eine Programmiersprache: ";
$lang = <STDIN>;
chomp $lang;
$name = $inventors{$lang};
print "Diese Sprache wurde geschaffen von $name.\n";
print "Ist das richtig? ";
$correct = <STDIN>;
chomp $correct;
if ($correct eq "n" || $correct eq "N") {
 print "Von wem denn sonst? ";
 $name = <STDIN>;
 chomp $name;
 $inventors{$lang} = $name;
}

Noch ein Hinweis für die ganz Schreibfaulen: Auf ein Element kann man nicht nur durch $hash{'key'}, sondern auch über $hash{key} zugreifen.

Möchten Sie ein solches Hash komplett ausgeben? Das geht so:

<em>#!/usr/bin/perl</em>
<em># hash4.pl -- by W. Jährling</em>
<em># Initialisierung von %inventors wie oben...</em>
foreach $lang (keys %inventors) {
 $name = $inventors{$lang};
 print "$lang - $name\n";
}

Die Funktion "keys" liefert die Namen der Schlüssel eines Hashes als Array. Dieses Array kann dann wie oben gezeigt ganz normal in einer foreach-Schleife verwendet werden. Jetzt gucken Sie nicht schon wieder so! Was stört Sie denn diesmal? Sie wollen, dass das Ganze auch noch sortiert ausgegeben wird? *Seufz*! Na gut, dann ändern Sie eben die Zeile

foreach $lang (keys %inventors) {

In

foreach $lang (sort keys %inventors) {

um. Wenn schon beim vorherigen Versuch bei Ihnen alles sortiert ausgegeben wurde, so liegt das wohl daran, dass wir das Hash sortiert initialisiert und danach nichts daran geändert haben. Gehen Sie aber nie davon aus, dass keys ein sortiertes Array liefert.

So, das war das. Bald können wir wohl mit CGI anfangen.


[<< Zurück] [Weiter >>]
Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung