Artikel im Internet unter http://www.hidemail.de/blog/hash-of-aus-arrays.shtml.
Samstag, 28.4.2007, 00:00:31 Uhr

Hash of Arrays - Oder: Wie bilde ich ein Hash aus Arrays


Nachdem ich hier das Thema schonmal aufgegriffen habe (etwas versteckt vielleicht), möchte ich das Thema nochmal aufgreifen: Hash of Arrays, also ein Hash, der Arrays enthält.Hört sich nun etwas verquert an, ist aber ne schöne und effektive Sache, wenn man viele Daten im Systemspeicher verwalten will.

Anlegen kann man so ein Array in einem Hash wie gewohnt per push(), also zum Beispiel

push (@{$hashname{$bezeichner}},$wert);
# oder per Wertzuweisung
@{$hashname{$bezeichner}}=@array;


Hoppla, sieht kompliziert aus? Nunja, gewöhnungsbedürftig auf jeden Fall.
Und wo liegen jetzt die Vorzteile?

Also, ich sags mal in Worten, bevor ich's am Code zeige:
Wenn man auf verschiedene Listen per Name zugreifen will ist ein Hash aus Array genau das Richtige.

Zum Beispiel, ich habe eine Liste mit
Monaten: Januar, Februar, März, April, Mai ...

und eine Liste mit den Tagen
1,2,3,4,5,6,7,8,9 ...

und noch eine Liste mit den Wochentagen:
Montag, Dienstag, Mittwoch, Donnerstag, Freitag ...

Und ich will alle Daten in einen Variablentyp, und will relativ "einfach" darauf zugreifen, dann kann ich es folgendermaßen tun

@Monate=("Januar", "Februar", "März", "April", "Mai");
@Tage=(1,2,3,4,5,6,7,8,9);
@Wochentage=("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag");

@{$daten{Monate}}=@Monate;
@{$daten{Tage}}=@Tage;
@{$daten{Wochentage}}=@Wochentage;



Zugreifen kann ich dann auf einzelne Elemente wie gewohnt per

$Monateins=@{$daten{Monate}}[0];

# oder mit
foreach (@{$daten{Monate}}){
#Ein Array nacheinander abarbeiten ...
}

# oder

foreach $kategorie (keys %daten){
foreach (@{$daten{$kategorie}}){
# jede Kategorie mit jedem Array
# nacheinander abarbeiten ...
}

}



Vielleicht ein besseres Beispiel, um zu sehen , was gemeint ist

# Legt eine Liste mit verschiedenen Fahrzeugen an
use strict;

my %autos;

push (@{$autos{Hersteller}},"Volkswagen");
push (@{$autos{Hersteller}},"BMW");
push (@{$autos{Hersteller}},"Mercedes");

push (@{$autos{Farbe}},"Gelb");
push (@{$autos{Farbe}},"Blau");
push (@{$autos{Farbe}},"Extremgruenmetallic");

push (@{$autos{Baujahr}},"1967");
push (@{$autos{Baujahr}},"2002");
push (@{$autos{Baujahr}},"2007");


#ich such jetzt alle VW's, oder besser den Einen...
my $cou=0;
foreach (@{$autos{Hersteller}}){
if ($_ eq 'Volkswagen'){
print "Die Farbe des ".@{$autos{Hersteller}}[$cou]." ist ".@{$autos{Farbe}}[$cou].". Das Baujahr ist ".@{$autos{Baujahr}}[$cou].".\n";
}
$cou++;
}




Ausgabe:
Die Farbe des Volkswagen ist Gelb. Das Baujahr ist 1967.

Klar, mag man jetzt sagen, das hätt ich aber auch mit 3 einzelnen Arrays hingekriegt. Stimmt ja auch, aber da hätt ich wissen müssen, daß ich 3 Kategorien habe und im einfachsten Fall, wie die dann heißen.
Mit dem Hash aus Array kann man aber ohne Probleme noch eine 4. oder 5. oder 6. Kategorie einführen.

Prima Sache, wenn man es mal verstanden hat!


Artikel im Internet unter http://www.hidemail.de/blog/hash-of-aus-arrays.shtml.