Thread Grundlegendere Fragen zu mehrdimensionalen Arrays (20 answers)
Opened by Sven_123 at 2010-06-01 15:26

Sven_123
 2010-06-01 15:26
#137840 #137840
User since
2010-06-01
120 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich bastel mir seit einiger Zeit kleinere Perlscripte um Dateien auszulesen, umzuordnen und ähnliches. Mein Perlwissen beschränkt sich dabei auf das, was ich in einer Minieinführung von zwei, drei Stunden mitbekommen hab und etwas mehr, das ich mir im Internet zusammengeklaubt habe - letzteres allerdings teilweise ohne wirkliches Verständnis, wie man gleich wohl feststellen wird. ;)

Um Dateien einzulesen und die Einträge als Arrays zu speichern, benutze ich im Normalfall so etwas:
Code: (dl )
1
2
3
4
5
6
7
open en, "< ../TRAJ".$i."/RESULTS/en.dat";
while (<en>){
@line = split;
@z[$l] = [@line];
$l++;
}
close en;

Der wichtige Teil ist hierbei Zeile 4. Ich hatte das bisher so verstanden:
Mein @z ist selbst aus mehreren Arrays aufgebaut, wobei diese über den Index [$l] angesprochen werden. Hier wird nun mein Array z Nr. l "@z[$l]" dem davor definierten Array line "@line" gleichgesetzt.
Ich versteh zwar nicht, warum die eckigen Klammern um @line nötig sind, da ich diese bei einem "@a=(1, 2); @b=@a;" ja nicht brauche und ich mein @z[$l] in dem Zusammenhang einem @b als gleichwertig verstanden hätte, aber obiges funktioniert aufjedenfall...

Jetzt wollte ich gestern mehrere eingelesene Dateien gleichzeitig als Array gespeichert haben, um sie danach miteinander zu vergleichen. Da ich mal mehr und mal weniger haben werde, wollte ich nicht für jede einen einzelnen Array definieren, sondern ich dachte mir, ich füg quasi einfach eine Dimension hinzu. Der Input lautete:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
for $i (1 .. $ARGV[0]){
open xyz, "< ".$ARGV[$i];
$l=0;
while (<xyz>){
@line = split;
@z[$i][$l] = [@line];
$l++;
}
close xyz;
}

Das ging allerdings nicht mehr. Ich hab später von einem Kollegen meines Vaters erklärt bekommen, dass ich da in Zeile 6, das @z[$i][$l] durch $z[$i][$l] ersetzen muss. Das funktioniert auch, ich schreib es hier aber dennoch, da ich nicht verstehe warum es so geschrieben werden muss und meine Probleme nachher noch weitergingen.
Sagen wir, in @line stünde (1, 2, 3). Ich möchte also z.B. $z[1][0][0] die 1 zuweisen, $z[1][0][1] die 2 und $z[1][0][2] die 3. Dann ist doch z[1][0] ein Array, in dem diese drei Zahlen stehen und kein Skalar...?

Schlussendlich hänge ich gerade daran einem neuen Array einen der alten Arrays zu übergeben. Ich könnte natürlich eine Schleife über sämtliche Indizes laufen lassen und jeden Wert einzeln übertragen, aber ich wüsste eigentlich lieber, wie ich das kompakt schreibe. Da das ganze inzwischen etwas mehr als eine kleine, als Einzeiler zu beantwortende Frage ist (denke ich*g), wollte ich jedoch oben erwähnten nicht bedrängen und dachte, vielleicht findet sich hier jemand, der die Muße hat es mir zu erklären.
Nicht funktioniert haben:
Code: (dl )
1
2
3
4
5
6
for $j (2 .. 7){
$y[1][$j]=[$z[1][$j]];
}
for $j (2 .. 7){
$y[1][$j]=[@z[1][$j]];
}


Vielen Dank für sämtliche Tips, Sven :)
Last edited: 2010-06-01 15:32:24 +0200 (CEST)

View full thread Grundlegendere Fragen zu mehrdimensionalen Arrays