Suchen von unten nach oben?

Hallo,
kann mir jemand sagen, ob man mit Perl auch von unten nach oben eine Datei durchsuchen kann, denn ich will z.B. aus diesen Daten (siehe unten), die in einer bestimmten Datei gespeichert sind, den Text (auch Sonderzeichen, Ziffern enthalten) zwischen den letzten PASS und den FAIL!
Geht es, das ich von unten suche und einfach von FAIL bis zum ersten PASS alles rausfiltere?

12.12.06 PASS
ölaksjfdöljaf
13.12.06 PASS
asälöjaöslkf1
14.12.06 FAIL

GRUSS

Auch hallo.

kann mir jemand sagen, ob man mit Perl auch von unten nach
oben eine Datei durchsuchen kann,

Ja, dazu könnte man das Modul File::ReadBackwards verwenden.
Gemäss ISBN 3-89721-474-1 Buch anschauen (Seite 61) lassen sich die aktuellsten Einträge einer Datei (hier: status.log) so abfragen:

use FileReadBackwards;
my $bw = File::ReadBackwards-\>new( 'status.log' )
 or die "Kann 'status.log' nicht lesen: $!\n";

exit( 0 ) if $bw-\>readLine() =~ /up/;

Ganz alterntiv fasst man die Zeilen der Datei als Array auf und vertauscht dann die Indizes.

HTH
mfg M.L.

Hallo,

kann mir jemand sagen, ob man mit Perl auch von unten nach
oben eine Datei durchsuchen kann, denn ich will z.B. aus
diesen Daten (siehe unten), die in einer bestimmten Datei
gespeichert sind, den Text (auch Sonderzeichen, Ziffern
enthalten) zwischen den letzten PASS und den FAIL!
Geht es, das ich von unten suche und einfach von FAIL bis zum
ersten PASS alles rausfiltere?

12.12.06 PASS
ölaksjfdöljaf
13.12.06 PASS
asälöjaöslkf1
14.12.06 FAIL

Ich greife mal M.L.s Vorschlag mit File::ReadBackwards auf (Doku gibts hier: http://search.cpan.org/~uri/File-ReadBackwards-1.04/… )

ungetestet:

use File::ReadBackwards;
my $file = File::ReadBackwards-\>new( 'testfile' ) or
 die "can't read 'testfile': $!" ;
until ($file-\>eof){
 my $line = $file-\>readline;
 chomp $line;
 if ($line =~ m/\d\d\.\d\d\.\d\d\s+(FAIL|PASS)){
 my $next\_line = $file-\>readline;
 # hier enthält $next\_line die Daten 
 # und $1 entweder PASS oder FAIL
 } else {
 warn "Can't parse line '$line'\n"
 }
}

Grüße,
Moritz

Hallo,
ich will aber ohne irgendwelche Packete, wie FileReadBackwards, weil
ich es auf einem alten Unix-Server verwende und die Packete dort nicht
zu installieren sind!!!
Geht es auch anderes???

Trotzdem schon mal danke!!

Hallo nochmal.

ich will aber ohne irgendwelche Packete, wie
FileReadBackwards, weil
ich es auf einem alten Unix-Server verwende und die Packete
dort nicht
zu installieren sind!!!

Über welche Perlversion verfügt der Server denn ? Herauszufinden mit

 perl -v

Ob ein bestimmtes Modul installiert ist lässt sich z.B. mit

perl -e use "File::ReadBackwards"

herausfinden.

Geht es auch anderes???

Sicher. Aber mit den Modulen geht es viel einfacher :wink:

Ausserdem kann man die Module auch in ein eigenes Verzeichnis installieren und von dort aufrufen. Im Code oder den Pfadangaben des Unix Systems ist das dann aber entsprechend zu würdigen.

mfg M.L. ((Active)Perl 5.8.x unter Windows und Linux)

Hallo,

ich will aber ohne irgendwelche Packete, wie
FileReadBackwards, weil
ich es auf einem alten Unix-Server verwende und die Packete
dort nicht
zu installieren sind!!!

Dann wäre es eigentlich Zeit, auf eine neuere Perl-Version upzudaten.

Wenn die Datei problemlos in den Arbeitsspeicher passt, kannst du sowas machen:

open (my $f, "datei.log") or die "Can't read file 'datei.log': $!";
my @lines = reverse ;
close $f;

# jetzt sind in @lines die Zeilen in umgekehrter Reihenfolge, dann 
# kannst du damit arbeiten.

Grüße,
Moritz

1 Like

Hallo nochmal,

ich finde es ziemlich dreist, so eine Frage an mehreren Stellen gleichzeitig zu stellen, dann macht man sich doppelte Arbeit weil man Antworten gibt, die schon jemand anderes geschrieben hat:

http://board.perl-community.de/cgi-bin/ikonboard/iko…;

Mein letztes Posting zu dem Thema.
Moritz

Hi,
Moritz diese Version hilft mir nicht weiter, da die Datei ja komplett gedreht wird, jedes Wort ist in umgekehrter Reihenfolge, wie soll ich das dann in meiner Ausgabedatei lesen können!
Mit reverse geht es dann irgendwie nicht!

open (my $f, „datei.log“) or die „Can’t read file ‚datei.log‘:
$!“;
my @lines = reverse ;
close $f;

jetzt sind in @lines die Zeilen in umgekehrter Reihenfolge,

dann

kannst du damit arbeiten.

Ich will aber dass die Datei sozusagen von unten durchsucht wird, dabei aber die Wörter nicht umgekehrt werden!

Hallo.

Der junge Mann dürfte wegen des Crosspostings verärgert sein. Obwohl die Qualität der Antworten dort ähnlich wie hier ist…

Das Perl Kochbuch (deutsche Ausgabe, Seite 331, Kapitel 8.4) hält jedenfalls folgendes bereit:

#!/usr/bin/perl -w
use strict;
use warnings;
use Tie::File;

my $FILENAME = "PerlExOverLimit.txt";
tie(my @lines, "Tie::File", $FILENAME, mode =\> 0)
 or die "Kann $FILENAME nicht binden: $!";
my $max\_lines = $#lines;
for (my $i = $max\_lines; $i; $i--) {
 printf "%5d %s\n", $i+1, $lines[$i],
}

Inhalt der PerlExOverLimit.txt:

HTTP 200 OK
Content-type: text/html



Your request exceeded the PerlEx data size limits configured on this
server. Please contact the web site administrator.

Und nach der Behandlung gibt es folgende Ausgabe:
8

Hi,
ich habe den Fehler gefunden und zwar läuft es gut mit reverse, doch wenn ich ein

Code
undef $/;

in meinem Code setze dreht er die Datei einfach nicht um?!

So sieht es bei mir am Anfang der Datei aus:
Code

$quelle = $ARGV[0];
$x = $ARGV[0];
$x =~ s/(\w+).\w+/$1/;
$ziel = $x;

open (INPUT,"$ziel.txt") or die „konnte $ziel nicht oeffnen,$!\n“;

$_ = ;
close (INPUT);

Warum kann ich nicht ohne undef $/; arbeiten???

ich will aber ohne irgendwelche Packete, wie
FileReadBackwards, weil
ich es auf einem alten Unix-Server verwende und die Packete
dort nicht
zu installieren sind!!!

das ist schade. was kommt denn für eine fehlermeldung beim installieren?
ohne die kann man dir schlecht helfen.

Geht es auch anderes???

sicher. du guckst in den quelltext des moduls und programmierst
es nach.

ach ja, hast du zufällig ein paar fragezeichen und ausrufezeichen
zuviel? sieht zumindest so aus. scnr