perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 02:21

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragVerzweiflung bei Mehrdimensionalen Array
Seitenanfang
Ok, ich weiß das Thema wurde schon unzählige mal durchgekaut, aber ich weiß einfach nicht wie ich es besser machen kann.

Ich habe im Moment eine Datei, da sind Informationen von mehreren Bildern drin. Jedes Bild hat eine Ursprungsdateiname, eine Nr und den Correlationswert.
Das will ich in ein dreidimensionales Array schreibe, wobei in der ersten ebene die Ursprungsdatei ist, in der zweiten Dimension sind die Datensätze der Bilder die zur Ursprungsdatei gehören und die dritte Dimension hat dann nur die drei Werte:
0 -> Fortlaufende Nr
1 -> Dateiname der Ursprungsdatei
2 -> Correlationswert

Wenn ich also auf $array[1][2][0] zugreife, bekomme ich also von der zweiten Ursprungsdatei, das dritte Bild und davon die fortlaufende Nr.

Das funktioniert alles soweit, aber wenn ich jetzt versuche die Längen heraus zu bekommen, damit ich die Daten in einer Schleife durchlaufen kann, dann klappt garnichts mehr...

Hier mein bis jetzt versuch:
-->
for(my $i=0; $i<$length; $i++) {
my $length2 = ${$array[$i]};
for(my $j=0; $j<=$length2; $j++) {
print "$array[$i][$j][1]\n";
}
}
<--

Der Fehler ist folgender:
Not a SCALAR reference at ./jnk.pl line 49

Hat jemand vielleicht einen Tipp für mich, oder ne Idee wie ich meine Daten besser strukturieren kann?

Datum: 11.06.2007-14:35

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
,,Not a SCALAR reference at ./jnk.pl line 49''

Ok, was sagt uns der Fehler? Es sagt uns, dass das was man als Skalar zu dereferenzieren versucht ueberhaupt keine Skalarreferenz ist.


my $length2 = ${$array[$i]};

Hier dereferenzierst du $array[$i] als Skalar, wenn es aber doch eine Arrayreferenz ist oder undef?

Wie bekommt man den Index des letzten Elements eines Arrays?


my @array = qw(aaa bbb ccc);

my $idx_last = $#array;


Und wie geht das bei einer Referenz auf ein Array, ganz einfach

my $arrayref = \@array;

my $idx_last_ref = $#{$arrayref};

Zu unterscheiden ist auch der Index des letzten Elements von der Anzahl der Elemente bzw. Laenge des Arrays, die 'Laenge' erhaelst du durch 'scalar'


my $length = scalar(@array);

# bzw.
my $length_ref = scalar(@{$arrayref});

So lange du nicht wirklich den Index brauchst wuerde ich empfehlen statt einer Zaehler-Schleife einfach


foreach my $image ( @image_files ) {
foreach my $image_data ( @{$image} ) {
foreach my $info ( @{$image_data} ) {
# process image...
}
}
}

verwenden, dass macht den Code besser lesbar und dadurch auch besser wartbar, dazugehoert auch die Verwendung von aussagekraeftigen Bezeichnern fuer die Variablen.

Datum: 11.06.2007-15:05

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
ok, ich versuche es so zu machen, wie du es mir vorgeschlagen hast, hört sich auch logisch an, aber ich bekomm die einzelnen arrays gerade nicht referenziert.

irgendwie steh ich gerade auf dem schlauch und kann mir nicht helfen.

ich müsste ja die referenzen in einer schleife erstellen, weil ich nicht weiß wieviel dimensionen das array in der ersten ebene hat.

kann man das verstehen?

@array[0][0][0]
@array[1][0][0]
@array[2][0][0]
@array[3][0][0]
@array[4][0][0]

hier mal mit 5 elementen gerechnet, dann müsste ich jedes mal eine neue referenz erstellen damit ich auf die andere ebene zugreifen kann, hoffe das ist verständlich.

danke fürs helfen, wurm

Datum: 12.06.2007-09:41

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
Hab leider nicht begriffen was du meinst, hast du denn vielleicht ein paar Beispiele von den Daten die in die Arrays packen moechtest bzw. ein Ausschnitt aus der Datei?

Datum: 12.06.2007-13:16

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
ok, ich hoffe es muss mir nicht peinlich sein, aber ich muss viele umwege benutzen...

als erstes habe ich eine datei in der die correlationswerte gespeichert sind, ein wert pro zeile,

beispiel:
-->
0.155194
0.209504
0.200055
0.195965
0.182544
0.181988
0.191788
0.215066
0.176065
0.218968
0.365786
0.336626
0.368857
0.212224
0.240023
0.271475
0.253736
0.209746
0.223407
0.207309
0.217691
-->

dann rufe ich ein Programm auf und fange die Ausgabe des Programs auf:
-->
...ons available:
ALIGNMENT MSA/CLASSIFICATION EULER/ANG_RECONST
THREED/EULER PROJ_MATCHING FABOSA
STATISTICS RESOLUTION INDEX
HOWMANY SIZE STORY/HISTORY
TITLE HISTOGRAM SORT
Please specify option [] : TITLE
1: TIFF input image = 3572.tif - CTF FLIPPED (BAND)
2: TIFF input image = 3572.tif - CTF FLIPPED (BAND)
3: TIFF input image = 3572.tif - CTF FLIPPED (BAND)
4: TIFF input image = 3572.tif - CTF FLIPPED (BAND)
5: TIFF input image = 3572.tif - CTF FLIPPED (BAND)
6: TIFF input image = 3567.tif - CTF FLIPPED (BAND)
7: TIFF input image = 3567.tif - CTF FLIPPED (BAND)
8: TIFF input image = 3567.tif - CTF FLIPPED (BAND)
9: TIFF input image = 3567.tif - CTF FLIPPED (BAND)
10: TIFF input image = 3567.tif - CTF FLIPPED (BAND)
11: TIFF input image = 3602.tif - CTF FLIPPED (BAND)
12: TIFF input image = 3602.tif - CTF FLIPPED (BAND)
13: TIFF input image = 3602.tif - CTF FLIPPED (BAND)
14: TIFF input image = 3602.tif - CTF FLIPPED (BAND)
15: TIFF input image = 3602.tif - CTF FLIPPED (BAND)
16: TIFF input image = 3602.tif - CTF FLIPPED (BAND)
17: TIFF input image = 3571.tif - CTF FLIPPED (BAND)
18: TIFF input image = 3571.tif - CTF FLIPPED (BAND)
19: TIFF input image = 3571.tif - CTF FLIPPED (BAND)
20: TIFF input image = 3571.tif - CTF FLIPPED (BAND)
21: TIFF input image = 3571.tif - CTF FLIPPED (BAND)

Next useful IMAGIC command: HEADERS
<--

Ich durchsuche dann die Ausgabe und speichere die Dateiname.

Ich will dann später auf die Daten zugreifen, die immer zu einem Bild gehören, desswegen speichere ich die daten in einem mehrdimensionalen array.

Hier mein Programmcode
-->
my $test = qx(./head.b); # Hier rufe ich das Programm mit einem externen Shellscript auf
my @array = split("\n", $test);
my $count = 1;
my $string="";
my @micrographs;
my @all;

# Hier lesen wir die Ausgaben des HEAD Scripts aus und es werden die Daten für
# jeden Micrograph gespeichert in einem Array @all
foreach(@array) {
if(/=\ (.*)\ -/) {
if($string ne $1) { # überprüfen ob es sich um ein neuen Micrograph handelt
push(@all,\@micrographs); # Daten im Array all speichern
splice(@micrographs,0); # die Daten können gelöscht werden
}
$string = $1;
my @data = ($count, $1, $correl[$count-1]);
print "$count ";
push(@micrographs,\@data); # Den Datensatz zum Array micrograph hinzufügen
$count++;
}
}
push(@all,\@micrographs); # Den letzten Datensatz speichern
shift(@all); # Das erste Element löschen.

#print "$micrographs[0][1]\n";

my $length = @all;
print "$length $all[1][1][0]\n";

for my $i ( 0..scalar(@all)-1 ) {
for my $j ( 0..scalar(@{$all[$i]})-1 ) {
for my $k ( 0..scalar(@{$all[$i][$j]})-1 ) {
print "$all[$i][$j][$k] ";
}
}
}
<--

Ok, ich hoffe dass ich mich für den code nich schämen muss, wäre für tipps wie immer dankbar

Datum: 12.06.2007-13:36

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
hatte in dem teil noch einen Fehler,

push(@all,\@micrographs); # Daten im Array all speichern

sollte eigentlich so aussehen

push(@all,[@micrographs]);

hab schon die ganze zeit auch fehler gesucht, warum in die ganze zeit die gleiche referenz drin steht....

Datum: 12.06.2007-14:05

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
Wenn man die Länge eines Arrays nicht kennt und man das Array in einer Schleife durchlaufen will, kann man das so machen:

for my $i ( 0..scalar(@array)-1 ){
...
}

Wenn ein Array so aussieht:

my @array = (
[1,2,3,5,87],
[1,6,2],
);

Dann kann man so arbeiten:

for my $i ( 0..scalar(@array)-1 ){
for my $j ( 0..scalar(@{$array[$i]})-1 ){
print $array[$i]->[$j];
}
}

Datum: 12.06.2007-11:41

Beitragre: Verzweiflung bei Mehrdimensionalen Array
Seitenanfang
ok, ich denke ich hab es hinbekommen.

meine Schleife sieht jetzt so aus:
-->
for my $i ( 0..scalar(@all)-1 ) {
for my $j ( 0..scalar(@{$all[$i]})-1 ) {
for my $k ( 0..scalar(@{$all[$i][$j]})-1 ) {
print "$all[$i][$j][$k] ";
}
print "\n";
}
print "\n";
}
<--

die gibt mir die werte eigentlich genau so aus, wie ich es mir vorgestellt habe.

bedank mich an der stelle...

Datum: 12.06.2007-14:03

-






-
-