opi: Pointer ans Ende der Datei setzen mit seek

Beitrag lesen

Hallo Siechfred,

Ja, siehe seek (3. Parameter).

Danke. Ich bin gerade erst nach Hause gekommen, hatte die Lösung
allerdings gefunden. seek(FILE,0,2) war es.

Nun, ich möchte gerne eine Datei ab einer bestimmten Zeile lesen.
Um genau zu sein, die _letzten_ n Zeilen einer Datei. Die Datei
wächst stetig um mehrere Zeilen an.

Da jede Zeile in der Datei die gleiche Stringlänge hat, benötige ich
die Größe der Datei in Bytes, um an die Richtige Stelle in der Datei
mit seek springen zu können.

Mein bisheriges Vorgehen:

sysopen FILE,$file,O_RDONLY or die $!;
flock(FILE,LOCK_SH);
my index = [];
my $i = 0;

while (<FILE>) {
   $index->[$i] = tell(FILE);
   $i++;
}

seek(FILE,$index->[$i-30],0); # 30 = Anzahl Zeilen

while (<FILE>) {
   # Verarbeitung
}

close FILE;

Dieses Verfahren bringts nicht mehr, da die Dateien mittlerweile
eine Größe von mehreren Gigabytes haben und der Durchlauf einfach
zu lange dauert.

Mein geplantes neues Vorgehen:

my $lsize = 500; # Zeilenlänge in Bytes
sysopen FILE,$file,O_RDONLY or die $!;
flock(FILE,LOCK_SH);
seek(FILE,0,2);
my $bytes = tell(FILE);
my $pos = $bytes-$lsize*30; # 30 = Anzahl Zeilen
seek(FILE,$pos,0);

while (<FILE>) {
   # Verarbeitung
}

close FILE;

Ist das so richtig? Ich habe es noch nicht probiert und muss noch
ein wenig basteln. An dieser Stelle habe ich aber noch eine andere
Frage...

Wie splitte ich am besten jede Zeile in ihre Einzelstrings?
Mit substr oder unpack?

Eine Zeile hat zum Beispiel den Aufbau:

Spalte 1  Spalte 2  Spalte 3  Spalte 4  Spalte 5

dies      ist       ein       test      nummer 1
und       noch      ein       test      nummer 2
schon     wieder    ein       test      nummer 3

Mit split selber würde es nicht gehen, da jeder Delimiter in einer
Spalte selber vorkommen könnte.

Für Hilfe wäre ich super dankbar.

Syntaxfehler mögen mir vergeben werden :-)

Greez,
opi

--
Selfcode: ie:( fl:( br:^ va:) ls:] fo:) rl:( n4:? ss:| de:] ch:? mo:|