Problem: Datei mit array im array einlesen
CharlesM
- perl
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.)
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
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]);
}
$anonym[0]->[0] = 'Otto';
$anonym[0]->[1] = 'Walkes';
my @ergebnis;
foreach my $key (@anonym) {
push(@ergebnis, "$key->[0],$key->[1]");
}
print join "\n", @ergebnis, "\n";
__END__
Rolf,Rost
Ulrich,Hansel
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);
my @array;
open (FH, ...
my $val = <FH>;
close(FH);
eval $val;
##########################
Oder zB mit Storable (perldoc Storable)
Tschoe qw(Matti);