Array in Hash

ltPerly

Mitglied
Hallöchen, ich hab da mal ein Anliegen.

Ich habe ein Script geschrieben, welches aus einer Datei ein paar Infos ausliest.

Dabei gibt es im Prinzip immer eine Markierung, einen Bezeichner und einen zugehörigen Wert.
z.B.: "address : <Name> <Adresse>"
-> wenn am Anfang "address" steht, folgt danach der Name und die zugehörige Adresse, welche erkannt werden soll.

Die Bezeichner (die Namen) speichere ich alle in einem Array und den Wert (die Adresse) ordne ich dann in einem Hash zu.

Mal angenommen jemand hat mehrere Adressen ...
-> "address : <Name> {<Adresse>}"
... wie kann ich die Werte am dümmsten speichern?

Ich habe leider nicht rausgefunden, ob bzw. wie man innerhalb eines Hashes ein Array deklarieren kann - oder gibts da 'ne bessere Idee?
Ich will also zu einem Namen mehrere Adresse speichern - die sollen aber nicht als String aneinander geklatscht werden, sondern schon als Einzelelemente verfügbar sein.

Wäre super, wenn mir da jemand auf die Sprünge helfen könnte.

Gruß David.
 
Die Idee ist meiner Meinung nach die einzigst sinnvolle zur internen Speicherung der Daten.

In Perl geht das vermischen solcher Datenstrukturen extrem leicht und simple. Man muss sich nur einmal mit den Perl-Referenzen auseinandersetzen.

Mein Lösungsansatz würde so aussehen, dass ich einen Array namens @daten hätte. Dabei wäre jeder Eintrag in diesem Array ein Hash der die keys name und adressen hat. Im Key name wird dann einfach nur der Name hinterlegt. Und hinter dem key adressen verbirgt sich jetzt wiederum ein Array in das ich dann alle meine Adressen ablege. So kann ich dan bequem mit einer foreach-Schleife über alle Adressen eines Namen iterieren.

Beispielcode:
Perl:
my @daten;
while(my $line = <>) { # datei zeilenweise einlesen
	# jede zeilen zerlegen, den namen in $name speichern
	# jede gefunden adresse in @adressen legen
	
	# Jetzt erzeugen wir einen anonymen hash
	# mit den schlüsseln name und adresse
	# und weisen diesen ihre werte zu
	my $hashref = {
									name => $name,
									adressen => [ @adressen ]
								};
	
	# besonders ist hier die Zuweiseung bei adressen
	# Dort erzeugen wir durch die [] ein anonymes array
	# in das wir @adressen kopieren. Um jetzt auf die Daten
	# innerhalb dieses anonymen arrays zugreifen zu können,
	# müssen wir diesen dereferenzieren.
	

	# jetzt packen wir unsere hashreferenz mit dem namen und der liste der adressen
	# in unser daten-Array
	push(@daten, $hashref);
}

# um jetzt beispielhaft alle namen und deren adressen auszugeben
# würde man sowas machen:
foreach my $eintrag (@daten) {
	# da jeder eintrag in @daten eine Hash-Referenz ist,
	# müssen wir beim Zugriff darauf entsprechend mithilfe des -> Operators
	# dereferenzieren.
	# Alternativ könnte man auch einen Temporären echten Hash erzeugen:
	# my %hash = %{ $eintrag };
	# Dan kann man wie gewohnt auf $hash{key} zugreifen.
	print "Name: ".$eintrag->{name}."\n";
	
	# @{...} nimmt eine Arrayreferenz entgegen und dereferenziert diese,
	# wodruch wir zum tatsächlichen array kommen. Diesen gehen wir dann
	# einfach wieder Index für Index ab.	
	foreach my $adresse (@{ $eintrag->{adressen} }) {
		print "\tAdresse: ".$adresse."\n";
	}
}

Dürfte für jemandne der grade erst in die tiefen der Referenzen absteigt ziemlich schwer verständlich sein. Ich zumindest hatte anfangs so meine Probleme. Hilfreich ist hier, wenn man z.B. die Logik von Pointern in c verstanden hat, da man dann zumindest schonmal die abstraktion und unterscheidung zwischen einer Speicherstelle und deren tatsächlichen Wert verinnerlicht hat.

Weiterführende Dokumentation dazu gibts unter perldoc perlref und praktische Beispile zu derartig verschachtelten Datenstrukturen mithilfe der Perl-Referenzen gibt es perldoc perllol eine etwas rudimentärere Erleäuterung dazu gibts auch bei selfhtml wobei diese scheinbar gar nicht gezielt jetzt auf dein Problem eingeht (zumindest hab ich beim überfliegen nichts gesehen) Selfhtml -> Perl -> Referenzen

// Ah, hab noch ne gute Dokumentation vergessen: perldoc perldsc da findest du genügen Beispiele zu allen Problemen die nur irgendwie in Verbindung mit Perl Datenstrukturen auftreten können :)

Hoffe geholfen zu haben,
Sven
 
Zuletzt bearbeitet:
Riesiges Dankeschöööön ... hab das mal grad mit paar Testwerten probiert und klappt wunderbar.

Joa, mit Pointern hatte ich schon in mehreren Sprachen zu tun, aber Perl bin ich erst neu.

Danke auch für die Links zu den Dokumentationen ... werd ich mir alle mal durchgucken. :)
(und mit SelfHTML haste recht - hab bisher nur damit gearbeitet, aber für mein kleines Problem gabs da keine Lösung)
 
Zurück