Hi!
Nur sind Hashes in Perl viel flexibler als das, was du da in C geschrieben hast :)
Das stimmt natuerlich. Deswegen ist Perl ja auch eine Scriptsprache, im Gegensatz zu C. Nur erkaufst Du Dir diese Bequemlichkeit natuerlich durch hoeheren Speicherbedarf und sehr viel niedrigere Ausfuehrungsgeschwindigkeit. Das was ich da in C geschrieben habe, ist schlicht und einfach fuer das Problem massgeschneidert und dementsprechend optimiert, aber eben auch dementsprechend unflexibel.
In diesem Falle geht aber doch diese Unflexibilität bei Dir soweit, daß ich eben NICHT die Sprache in einer extra Variablen halten kann, so daß ich je nach deren Inhalt entweder die englische oder die deutsche Variante erhalte. Statt dessen muß ich hier den Programmcode anpassen ...
Und solche Strukturen kann ich mir ja auch unter Perl basteln. Oder etwas einfacher - ich nutze einen weiteren Namensraum:
package sprachen;
my $english, $deutsch;
package main;
$sprachen::english = qw(man woman);
$sprachen::deutsch = qw(Mann Frau);
printf("english: %s, %s\ngerman: %s, %s\n", $sprachen::english[0], $sprachen::english[1],
$sprachen::deutsch[0], $sprachen::deutsch[1]);
Wollte man eine aehnlich Flexibilitaet erlangen, muesste man in C das nachprogrammieren, was die Perlentwickler intern fuer Listen und Hashes gemacht haben. De facto muesste man die Daten in eine doppelt-verkettete Liste packen und geeignete Routinen zum Zugriff bereitstellen, idealerweise alles fein saeuberlich in ein Objekt verpackt.
Ich denke mal, daß Hashes in Perl über Hashes realisiert sind, weswegen sie wohl auch so heißen. Das funktioniert ungefähr so:
Ich habe ein Array, in dem ich meine Keys ablegen möchte bsp. Länge 100
Zu jedem Key den ich dort ablegen möchte, berechne ich den Hash-Wert nach einer Formel, die sämtliche möglichen Schlüsselwerte auf einen Wert von 0-99 bringt. An dieser Stelle im Array lege ich dann das Objekt bzw. eine Referenz darauf ab. Nun kann es aber auch vorkommen, daß zwei unterschiedliche Keys den gleichen Hash-Wert haben. In diesem Falle kann ich entweder eine Liste an dem entsprechenden Element ablegen, oder im Array solange weiter suchen, bis ich einen freien Platz finde ... Nun weiß ich nicht, wie genau die Dinger in Perl realisiert sind. Aber sicher werden nicht alle Objekte in einer doppelt verketteten Liste durchsucht, wenn mit einem konkreten Key nach einem Wert suche!
Fuer einen Hash implementiert man zwecks besserer Zugriffszeiten vielleicht eine Zusatztabelle, in der die Keys sortiert herumliegen und auf die zugehoerigen Values verweist. Daher sind Arrays und Hashes also sehr aehnlich, weshalb wohl auch der Begriff "assoziatives Array" entstanden ist.
Assoziativ halt, weil Strings anstelle von Integern für die Keys verwendet werden.
Jörk