Anzeige:
Ergebnis 1 bis 5 von 5

Thema: perl und arrays in arrays

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.01.2003
    Beiträge
    21

    perl und arrays in arrays

    Ich versuche zZ leider von wenig Erfolg gegrönt eine Array in einer Array zu platzieren in Perl.
    Dabei wird eine Datei ausgelesen und jede Zeile ergibt eine Array (Zeileninhalt wird durch Tabs separiert).
    Diese Arrays landen per push in einer großen Array bzw sie sollten dort landen.
    Tun sie aber nicht. Die Arrays die reinwandern haben nur das erste Element.

    Das heist aus
    @foobar=("a","b","c");
    wird
    @foobar=("a")
    in der Array in der ich die Zeiler Array reinpushe.


    Mein Script habe ich mal gleich mit drangehängt. Es ist ziehmlich verkürzt.
    Code:
    use strict;
    use CGI::Safe qw/ taint /;
    use CGI::Carp 'fatalsToBrowser';
    
    my $cgi = CGI::Safe->new;
    
    $CGI::DISABLE_UPLOADS = 1;
    $CGI::POST_MAX = 512 * 1024;
    
    my @zeilen;
    my $temp5;
    my @temp6;
    @zeilen=();
    $temp5="";
    my @temp7;
    
    open(LLIST,"<C:/liste.txt") or die "Can not open list: $!\n";
    while(<LLIST>) {
    $temp5=$_;
    $temp5 =~ s/\n//;
    @temp6=split(/\t/,$temp5); # Ja, ich hab es ueberprueft! Es liefert eine Array mit 3 Elementen zurueck
    push(@zeilen,@temp6);
    }
    close(LLIST);
    
    my $temp8=0;
    
    @temp7=@zeilen[$temp8]; # tja, das ist von einem Experiment uebrig. Ich wuerde aber gern die Array komplett direkt ansprechen ala $zeilen[0][2]
    
    
    print "Content-type: image/jpeg\n\n";
    binmode STDOUT;
    if (-e $temp7[2] && $temp7[2] ne '0') {
    open(IMAGE,"<".$temp7[2]);
    # Hier wird für open der dritte Wert aus der Zeile benutzt. Funktioniert nicht weil $temp7 und @zeilen[0] nur ein Wert statt dreien haben.
    } elsif($temp7[2] eq '0') {
    open(IMAGE,"<".$temp7[0]);
    # Hier wird für open der erste Wert aus der Zeile benutzt. Funktioniert!
    } else {
    # Hier sollte Perl eigentlich nie hinkomen...
    }
    binmode IMAGE;
    while (<IMAGE>) {
    print $_;
    }
    close(IMAGE);
    exit;

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    So z. B. ensteht eine 2 dimensionales array(slashes!)
    Code:
    @zweidimarray=(\@array,\@nocheinarray)

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.01.2003
    Beiträge
    21
    Original geschrieben von fork
    So z. B. ensteht eine 2 dimensionales array(slashes!)
    Code:
    @zweidimarray=(\@array,\@nocheinarray)
    Danke für den Hinweis. Aber ich habe noch ne Frage dazu:
    Ich muss ja zeilenweise die arrays zur array hinzufügen, kann ich dabei push benutzen und wenn ja wie?
    Eine andere Methode die mir einfallen ist wäre mit einer Counter-Variable zu arbeiten und immer das direkt zu setzen.

    Nun aber das blöde: Die eine Array ändert sich ja mit jedem Durschlauf von while. Wie kann man das in den Griff kriegen?

  4. #4
    Registrierter Benutzer
    Registriert seit
    30.12.2001
    Beiträge
    444
    Gute Frage, ist mir jetzt selbst spontan nicht aufgefallen. Du kannst ein benanntes Array in ein neues, anonym erzeugtes, speichern.

    z. B.:
    Code:
    @zweidimarray=( \@array, [ @nocheinarray ] )
    Die eckigen Klammern stehen für die Arrayreferenz. Um das zu verdeutlichen kannst Du Dir die Arrayadressen ja mal anzeigen lassen:
    Code:
    #!/usr/bin/perl
    @a=  ("1 2 3", "4 5 6");
    foreach ( @a ) {
            chomp();
            push(@zeile,[ split() ]);
    }
    
    print "Array Adresse: ".@zeile[0]."\n";
    print "Array Adresse: ".@zeile[1]."\n";

  5. #5
    Registrierter Benutzer
    Registriert seit
    20.01.2003
    Beiträge
    21
    Villeicht intressiert jemanden wie ich das jetzt gelöst habe. Ist zwar nicht elegant aber es funktioniert, wenn ich auch auf push verzichtet habe:

    Code:
    my $temp9=-1;
    # ...
    open(LLIST,"<C:/liste.txt") or die "Can not open list: $!\n";
    while(<LLIST>) {
    $temp5=$_;
    $temp5 =~ s/\n//;
    @temp6=split(/\t/,$temp5);
    $temp9++;
    @images_list[$temp9]=[split(/\t/,$temp5)];
    }
    Die andere Lösung wollte irgenwie nähmlich nicht.
    Wenn jemand ne elegantere Lösung hat würd ich mich freuen aber der obige Code erfüllt seinen Zweck.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •