Schrift
[thread]12267[/thread]

mehdimensionaler dynamischer array



<< >> 8 Einträge, 1 Seite
ekos
 2008-07-29 10:23
#112845 #112845
User since
2008-07-23
7 Artikel
BenutzerIn
[default_avatar]
Hallo alle zusammen,

ich versuche gerade einen mehrdimensionalen dynamischen Array zu erstellen. => ich weiß im vornherein nicht vieviel Elemente das Array erhalten wird.

Versucht habe ich es folgendermaßen:

@daten;
@datei = <INFILE>;
push(@daten,\@datei);

Dass mit dem dynamischen Anhängen klappt auch soweit ganz gut. Das Problem an der Sache ist, dass jedesmal wenn ich ein Element hinzufüge, die ersten Elemente mit dem letzten überschrieben werden.

Heißt wenn ich ein zweites Element einfüge, habe ich zweimal das zweite anstatt das erste (welches schon vorhanden war) und dem zweitem. Beim dritten, vierten usw. verhält es sich genauso, ich hab halt immer mehrmals das gleiche Element im Array.
moritz
 2008-07-29 10:50
#112846 #112846
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
ekos+2008-07-29 08:23:42--
Dass mit dem dynamischen Anhängen klappt auch soweit ganz gut. Das Problem an der Sache ist, dass jedesmal wenn ich ein Element hinzufüge, die ersten Elemente mit dem letzten überschrieben werden.


Zeig mal den Code der das macht (für uns ausführbar).
ekos
 2008-07-29 11:00
#112848 #112848
User since
2008-07-23
7 Artikel
BenutzerIn
[default_avatar]
ich glaub das wird schwer, denn ich lese dateien aus unterverzeichnissen eines speziellen verzeichnisses ein, dass ihr naturgemäß nicht habt. Der code funkt ungefähr so:

#!/bin/perl

$PFAD = "/etc";
opendir (DH, $PFAD);
@daten;

while ($file = readdir(DH){
$infile = "$PFAD/$file/dateityp"
open(INFILE,"<$infile");
@datei = <INFILE>;
push(@daten,\@datei);
}
moritz
 2008-07-29 11:03
#112849 #112849
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Das ist naturgemäß doof wenn du uns kein Beispiel baust, das wir auch benutzen (z.B. einfach ein paar Beispieldaten in einen __DATA__-Sektion bauen und split verwennden?).

Trotzdem glaube ich, den Fehler gefunden zu haben. Du benutzt jedes mal das gleiche Array @datei, dabei willst du eigentlich eine Kopie erstellen. Die kannst du z.B. so erzeugen:

Code: (dl )
push @daten, [@datei];
ekos
 2008-07-29 11:13
#112850 #112850
User since
2008-07-23
7 Artikel
BenutzerIn
[default_avatar]
ich würde gerne alles zu verfügung stellen was geht, bin aber leider ein absoluter anfänger und hab echt wenig ahnung :/

aber vielen dank, funkt wie ne eins jetzt :-D
(hab mich stunden damit rumgequält)
pq
 2008-07-29 12:22
#112853 #112853
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ekos+2008-07-29 09:00:52--
while ($file = readdir(DH){
$infile = "$PFAD/$file/dateityp"
open(INFILE,"<$infile");
@datei = <INFILE>;
push(@daten,\@datei);
}

unbedingt Wiki:use strict benutzen.
und das nächste mal darfst du auch gerne code-tags um deinen code herumschreiben
(siehe faq in meiner signatur).
der fehler ist einfach:
du füllst eine globale variable @datei mit dem inhalt der datei.
diese referenz pushst du nun in @daten.
im nächsten schleifendurchlauf füllst du *dieselbe* globale variable @datei. d.h.
die vorherige referenz, die du in @daten hast, wird auch umgeändert.
bei sowas immer mit my() initialisieren. mehr dazu in dem link zu strict.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ekos
 2008-07-29 15:14
#112866 #112866
User since
2008-07-23
7 Artikel
BenutzerIn
[default_avatar]
achso, deswegen auch eine kopie erstellen!!!

ich dachte ich pushe wirklich die daten und keine referenzen!

besten dank, dann lese ich mir doch gleich mal das strict zeug durch ;-)
nepos
 2008-07-29 15:39
#112868 #112868
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Naja, mit \@... sagst du ja eben genau, dass du hier eine Referenz willst ;)
<< >> 8 Einträge, 1 Seite



View all threads created 2008-07-29 10:23.