CharlesM: Problem: Datei mit array im array einlesen

Wenn ich eine (Text-)Datei öffne und einem array zuweise mit
open (DATEI, "<datei.text");
@zeilen = <DATEI>;
close (DATEI);
dann wird \n als Trennzeichen zwischen den einzelnen Elementen
des array interpretiert, so dass die 3.Zeile der Datei direkt aufrufbar wäre als $zeilen[2].
So weit, so gut.

Nehmen wir mal an, die einzelnen Zeilen seien selbst wiederum arrays, wobei die Elemente durch ein beliebiges Trennzeichen (z.B. Komma) voneinander getrennt sind. Frage: Gibt es die Möglichkeit, auf ein beliebiges Element der Datei datei.text direkt zuzugreifen, wenn ich angebe, welcher Separator verwendet wird?

Normalerweise würde man, um das 4.Element der 3.Zeile zu bekommen, folgendermassen vorgehen, wenn als Separator ein Komma verwendet wird:
@wert = split(/,/,$zeilen[2]);
$suchwort = $wert[3];

Frage ist, ob ich die split-Funktion irgendwie umgehen kann und mit einer einzigen Wertzuweisung direkt auf ein Element der verschachtelten Liste (array im array, unterschiedliche Separatoren: \n und Komma) zugreifen kann. (Die Auswahl des Separators in den untergeordneten Separatoren, also in den einzelnen Zeilen ist dabei freigestellt, das könnte man beim vorherigen Abspeichern von datei.txt frei wählen. \n dürfte es aber nicht sein, weil ich sonst beim Öffnen der Datei nicht erkennen kann, wieviele Elemente den einzelnen arrays zugeordnet sind.)

  1. Hallo,

    Frage ist, ob ich die split-Funktion irgendwie umgehen kann und mit einer einzigen Wertzuweisung direkt auf ein Element der verschachtelten Liste (array im array, unterschiedliche Separatoren: \n und Komma) zugreifen kann.

    also ob es eine eingebaute Funktion bei Perl gibt, weis ich nicht. Aber bestimmt gibt es im CPAN ein Modul für das Auslesen solcher Dateien. Oder Du baust Dir eine Funktion, die die Datei in ein zweidimensionales Array einliest und greifst dann auf dieses Array zu, wenn Du einen Wert brauchst. Allerdings scheidet diese Methode ab einer gewissen Dateigröße aus.

    viele Grüße
      Achim Schrepfer

    --
    http://reskit.speedesign.de/ - PHP-Bibliothek zum automatischen Erzeugen von HTML-Tabellen, -Formularen und -Baummenüs anhand von MySQL-Tabellen
    Selfcode: sh:) fo:| ch:| rl:° br:> n4:{ ie:% mo:} va:| de:< zu:| fl:( ss:) ls:& js:|
  2. Mahlzeit,

    du möchtest wahrscheinlich mit anonymen Arrays arbeiten.

    Viele Grüße, Rolf

    Beispiel:

    use strict;
    my @anonym;
    while(<DATA>){
     chomp;
     /^(\w+),(\w+)$/;
     push(@anonym, [$1,$2]);
    }

    Ein bischen was verändern...

    $anonym[0]->[0] = 'Otto';
    $anonym[0]->[1] = 'Walkes';

    my @ergebnis;
    foreach my $key (@anonym) {
        push(@ergebnis, "$key->[0],$key->[1]");
    }

    Ausgabe Ergebnis

    print join "\n", @ergebnis, "\n";

    __END__
    Rolf,Rost
    Ulrich,Hansel

  3. use Mosche;

    [Perl-Variablen persistent machen]

    Noch kurz was anderes zu diesem Thema:

    Du könntest zB mit Data::Dumper arbeiten, um deine Variablen in ihrem vollständigen Zustand wiederzubekommen. zB:

    my @array = ( [0, 1, 2],
                  [1, 2, 3],
                  [3, 4, 5]);

    use Data::Dumper;

    my $dumper = new Data::Dumper(@array);
    my $val = $dumper->Dump();
    open(FH, '>...
    print FH $val;
    close(FH);

    und dann irgendwo:

    my @array;
    open (FH, ...
    my $val = <FH>;
    close(FH);
    eval $val;

    ##########################

    Oder zB mit Storable (perldoc Storable)

    Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.