Thread dynamisch mehrdimensionales Array (19 answers)
Opened by sebi85 at 2010-10-27 10:09

payx
 2010-10-28 10:59
#142263 #142263
User since
2006-05-04
564 Artikel
BenutzerIn

user image
Hallo sebi85,

2010-10-28T08:05:33 sebi85
Der Ansatz ist nicht schlecht, aber ich habe immer noch das Problem, dass ich nicht mit einem Index wie bei einem Array arbeiten kann.

Dann solltest Du evtl. ein Array als erste Ebene benutzen; das würde auch das Problem mit der Reihenfolge lösen. Du hättest dann ein AoHoHoA also ein Array mit Hashreferenzen mit Hashreferenzen mit Arrayreferenzen, z.B.:

Code (perl): (dl )
$array[0]->{'A'}->{'Param 1'}->[0]='Value 3';

Quote
Ich habe 3 ineinandergeschachtelte For Schleifen.
In der ersten wird 'A' gesetzte in der zweiten dann 'Param1'...

Sorry, das Folgende habe ich nicht verstanden. Vielleicht habe ich zu wenig Zeit dafür aufgewandt. Aber das Vorgehen mit den drei ineinander geschachtelten Schleifen ist auf jeden Fall prinzipiell richtig, und die beschriebene Datenstruktur lässt sich damit problemlos bedienen. Stelle doch hier mal Deinen konkreten Code ein (bitte zwischen [code=perl] und [/code]), dann wird es vielleicht klarer.

Quote
Hier möchte ich das erste {$FUNCTION_ARRAY[$i]->att('name') durch eine Index ersetzen, damit ich den Wert aus der 1. Schleife hätte, was ja aber nicht geht.

Doch, die Werte aus den umschließenden Schleifen stehen Dir zur Verfügung. Werte aus vorherigen Schleifendurchläufen (falls das gemeint ist) kannst Du in Variablen zwischenspeichern usw., alles kein Problem.

Quote
Zudem ist der Hash nicht in der Reihenfolge, wie ich ihn gespeichert habe.

In der Tat, das ist bei Hashes so. Nach keys sortieren ist unproblematisch und würde im Beispiel auch zum richtigen Ergebnis führen. Wenn das in der Praxis nicht so sein sollte, kannst Du CPAN:Tie::Hash::Sorted verwenden (habe ich selbst noch nie gebraucht) oder eben doch auf ein Array ausweichen (s.o.).

Quote
Das mit dem Split_line kapiere ich zwar noch nicht so ganz.
$array[1]->[0]->{foo}="bar";
Was bedeutet das {foo}?

Hier ist ein AoAoH, also ein Array mit Arrayreferenzen mit Hashreferenzen gemeint. Was topeg zeigen wollte, ist, dass diese komplexe Datenstruktur automatisch aufgebaut wird, wenn Du nur einen Wert in dieser Struktur zuweist. Darunter versteht man Autovivikation (und das ist wirklich ein sehr tolles Feature von Perl). Die obige Zuweisung erzeugt eine Hashreferenz mit key = 'foo' und value = 'bar', die das erste Element einer Arrayreferenz ist, die das zweite Element des Arrays @array ist.

Bleib dran, das wird schon. Es dauert natürlich ein bisschen, bis man komplexe Datenstrukturen mühelos im Griff hat.

Grüße
payx

View full thread dynamisch mehrdimensionales Array