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?
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.
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?
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"
}
}
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???
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
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)
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.
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:
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!
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
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