Zeilenweise lesen einer Datei
Zeilenweise lesen einer Datei
am 03.04.2008 13:34:14 von Thomas Guettler
Hallo,
Ich möchte von einem Filedescriptor zeilenweise lesen
und jedesmal prüfen, ob das Lesen erfolgreich war. Als
Vorlage diente diese URL:
http://perldoc.perl.org/functions/readline.html
Leider funktioniert das nicht, wenn die letzte Zeile kein
Newline Zeichen am Ende hat:
{{{
open FD, "test.txt" or die $!;
for (;;) {
undef $!;
unless (defined( $line = )) {
die $! if $!;
last; # reached EOF
}
print "line $line";
}
close FD;
}}}
===> perl file.pl
line ...
Bad file descriptor at file.pl line 5, line 2.
Man könnte nun bei jedem Scheifendurchlauf prüfen ob
die Zeichenkette mit \n endet, aber gibt es nicht eine
bessere Lösung?
Thomas
Re: Zeilenweise lesen einer Datei
am 03.04.2008 13:55:25 von Peter Ludikovsky
Thomas Guettler wrote:
> Hallo,
>
> Ich möchte von einem Filedescriptor zeilenweise lesen
> und jedesmal prüfen, ob das Lesen erfolgreich war. Als
> Vorlage diente diese URL:
>
> http://perldoc.perl.org/functions/readline.html
>
> Leider funktioniert das nicht, wenn die letzte Zeile kein
> Newline Zeichen am Ende hat:
>
> {{{
> open FD, "test.txt" or die $!;
> for (;;) {
> undef $!;
> unless (defined( $line = )) {
> die $! if $!;
> last; # reached EOF
> }
> print "line $line";
> }
> close FD;
> }}}
>
> ===> perl file.pl
> line ...
> Bad file descriptor at file.pl line 5, line 2.
>
>
> Man könnte nun bei jedem Scheifendurchlauf prüfen ob
> die Zeichenkette mit \n endet, aber gibt es nicht eine
> bessere Lösung?
>
> Thomas
wäre es nicht einfacher so:
open FD,"test.txt" or die $!;
while($line = ){
#whatever
}
hth
/peter
Re: Zeilenweise lesen einer Datei
am 03.04.2008 14:11:00 von Michael Bernhard
Hi Thomas,
> Man könnte nun bei jedem Scheifendurchlauf prüfen ob
> die Zeichenkette mit \n endet, aber gibt es nicht eine
> bessere Lösung?
# perl -pe '' blablub.txt ;)
aka
# perl -ne ' print $_ ' blablub.txt
aka
#!/usr/bin/perl
while (<>) {
print $_;
}
VG
ciao
bemi
Re: Zeilenweise lesen einer Datei
am 03.04.2008 15:12:18 von Frank Seitz
Thomas Guettler wrote:
>
> Ich möchte von einem Filedescriptor zeilenweise lesen
> und jedesmal prüfen, ob das Lesen erfolgreich war.
Gibt es einen bestimmten Grund für diese akribische Prüfung?
Normalerweise programmiert niemand in Perl das Lesen
aus einer Datei so (wohl in der Annahme, dass das
sowieso nicht fehlschlägt).
> ===> perl file.pl
> line ...
> Bad file descriptor at file.pl line 5, line 2.
Unter Perl 5.8.8 funktioniert der Code,
nur leider nicht unter 5.10.0.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Zeilenweise lesen einer Datei
am 04.04.2008 15:07:05 von Thomas Guettler
Frank Seitz schrieb:
> Thomas Guettler wrote:
>> Ich möchte von einem Filedescriptor zeilenweise lesen
>> und jedesmal prüfen, ob das Lesen erfolgreich war.
>
> Gibt es einen bestimmten Grund für diese akribische Prüfung?
> Normalerweise programmiert niemand in Perl das Lesen
> aus einer Datei so (wohl in der Annahme, dass das
> sowieso nicht fehlschlägt).
Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
nicht.
Und $! nur am Ende prüfen geht nicht, weil zwischendurch
Routinen gerufen werden, die $! ggf. verändern ....
Thomas
--
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de
Re: Zeilenweise lesen einer Datei
am 06.04.2008 13:21:25 von ichhassesp
"Thomas Guettler" schrieb im Newsbeitrag news:65mnfpF2ghmh4U1@mid.individual.net...
> Frank Seitz schrieb:
>> Thomas Guettler wrote:
>>> Ich möchte von einem Filedescriptor zeilenweise lesen
>>> und jedesmal prüfen, ob das Lesen erfolgreich war.
>>
>> Gibt es einen bestimmten Grund für diese akribische Prüfung?
>> Normalerweise programmiert niemand in Perl das Lesen
>> aus einer Datei so (wohl in der Annahme, dass das
>> sowieso nicht fehlschlägt).
>
> Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
> nicht.
>
> Und $! nur am Ende prüfen geht nicht, weil zwischendurch
> Routinen gerufen werden, die $! ggf. verändern ....
Probier doch mal "local $!;" am Anfang jeder dieser Routinen. Das sollte den alten Wert beim Rücksprung wieder
herstellen.
Klaus
Re: Zeilenweise lesen einer Datei
am 06.04.2008 13:36:21 von Frank Seitz
Thomas Guettler wrote:
> Frank Seitz schrieb:
>>>Ich möchte von einem Filedescriptor zeilenweise lesen
>>>und jedesmal prüfen, ob das Lesen erfolgreich war.
>>
>>Gibt es einen bestimmten Grund für diese akribische Prüfung?
>>Normalerweise programmiert niemand in Perl das Lesen
>>aus einer Datei so (wohl in der Annahme, dass das
>>sowieso nicht fehlschlägt).
>
> Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
> nicht.
Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
einer Datei kannst du dir diese Prüfung aber guten
Gewissens schenken, und so coden:
while () {
# irgendwas mit $_ machen
}
Das machen alle so.
> Und $! nur am Ende prüfen geht nicht, weil zwischendurch
> Routinen gerufen werden, die $! ggf. verändern ....
Ist klar. Wie ich schon schrieb ist das Ganze
ein Problem von Perl 5.10.0, dort wird auf der Suche
nach dem letzten Zeilentrenner, wenn dieser nicht
vorhanden ist, über das Ende der Datei hinausgelesen
und $! irrtümlich gesetzt.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Zeilenweise lesen einer Datei
am 06.04.2008 13:58:17 von ichhassesp
"Frank Seitz" schrieb im Newsbeitrag news:65rqtnF2i16etU2@mid.individual.net...
> Thomas Guettler wrote:
>> Frank Seitz schrieb:
>
>>>>Ich möchte von einem Filedescriptor zeilenweise lesen
>>>>und jedesmal prüfen, ob das Lesen erfolgreich war.
>>>
>>>Gibt es einen bestimmten Grund für diese akribische Prüfung?
>>>Normalerweise programmiert niemand in Perl das Lesen
>>>aus einer Datei so (wohl in der Annahme, dass das
>>>sowieso nicht fehlschlägt).
>>
>> Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
>> nicht.
>
> Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
> einer Datei kannst du dir diese Prüfung aber guten
> Gewissens schenken .....
Nicht unbedingt Netzwerkverbindungen können unterbrochen werden, ein USB-Stick abgezogen. Es soll auch schon Kratzer auf
CDs gegeben haben. Ich habe vor langer Zeit mal gelernt
"If anything in your program can go wrong, it will".
>
> Das machen alle so.
Ich auch. Das ist aber kein Argument.
Gruß
Klaus
--
Persönliche Antwort bitte nur an
KWittrockweb.de
Re: Zeilenweise lesen einer Datei
am 06.04.2008 14:47:17 von Frank Seitz
K. Wittrock wrote:
> "Frank Seitz" schrieb im Newsbeitrag news:65rqtnF2i16etU2@mid.individual.net...
>>
>>Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
>>einer Datei kannst du dir diese Prüfung aber guten
>>Gewissens schenken .....
>
> Nicht unbedingt Netzwerkverbindungen können unterbrochen werden,
> ein USB-Stick abgezogen. Es soll auch schon Kratzer auf
> CDs gegeben haben. Ich habe vor langer Zeit mal gelernt
> "If anything in your program can go wrong, it will".
Wohl wahr.
>>Das machen alle so.
>
> Ich auch. Das ist aber kein Argument.
Ja. Nur leider weiß ich nicht, wie man es ohne
viel Gehampel sauber programmiert.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Zeilenweise lesen einer Datei
am 07.04.2008 17:14:03 von ichhassesp
"Frank Seitz" schrieb im Newsbeitrag news:65rv2nF2i16etU4@mid.individual.net...
> K. Wittrock wrote:
>> "Frank Seitz" schrieb im Newsbeitrag news:65rqtnF2i16etU2@mid.individual.net...
>>>
>>>Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
>>>einer Datei kannst du dir diese Prüfung aber guten
>>>Gewissens schenken .....
>>
>> Nicht unbedingt Netzwerkverbindungen können unterbrochen werden,
>> ein USB-Stick abgezogen. Es soll auch schon Kratzer auf
>> CDs gegeben haben. Ich habe vor langer Zeit mal gelernt
>> "If anything in your program can go wrong, it will".
>
> Wohl wahr.
>
>>>Das machen alle so.
>>
>> Ich auch. Das ist aber kein Argument.
>
> Ja. Nur leider weiß ich nicht, wie man es ohne
> viel Gehampel sauber programmiert.
Schön wäre es, wenn man einen Error-Handler definieren könnte. Oder eine Funktion ioerr() analog zu eof(). Den
Perl-Entwicklern wird die Arbeit schon nicht ausgehen.
Das ist vielleicht eine Idee (nicht getestet):
while (<>) {
iseof = eof();
... # tue was mit $_
}
unless (iseof) {die "Lesefehler\n"}
Gruß
Klaus
--
Persönliche Antwort bitte nur an
KWittrockweb.de
Re: Zeilenweise lesen einer Datei
am 08.04.2008 19:37:50 von hjp-usenet2
On 2008-04-03 13:12, Frank Seitz wrote:
> Thomas Guettler wrote:
>> Ich möchte von einem Filedescriptor zeilenweise lesen
>> und jedesmal prüfen, ob das Lesen erfolgreich war.
[...]
>> ===> perl file.pl
>> line ...
>> Bad file descriptor at file.pl line 5, line 2.
>
> Unter Perl 5.8.8 funktioniert der Code,
> nur leider nicht unter 5.10.0.
Ich sehe da keinen Unterschied zwischen 5.8.8 und 5.10.0. Beide geben
bei mir beim Input "foo\nbar" aus:
line foo
Bad file descriptor at foo line 10, line 2.
line bar
"line bar" (ohne newline am Ende) wird erst nach dem die ausgegeben,
weil STDOUT zeilengebuffert ist.
hp
Re: Zeilenweise lesen einer Datei
am 08.04.2008 20:01:08 von Frank Seitz
Peter J. Holzer wrote:
> On 2008-04-03 13:12, Frank Seitz wrote:
>>Thomas Guettler wrote:
>>>
>>>===> perl file.pl
>>>line ...
>>>Bad file descriptor at file.pl line 5, line 2.
>>
>>Unter Perl 5.8.8 funktioniert der Code,
>>nur leider nicht unter 5.10.0.
>
> Ich sehe da keinen Unterschied zwischen 5.8.8 und 5.10.0. Beide geben
> bei mir beim Input "foo\nbar" aus:
>
> line foo
> Bad file descriptor at foo line 10, line 2.
> line bar
>
> "line bar" (ohne newline am Ende) wird erst nach dem die ausgegeben,
> weil STDOUT zeilengebuffert ist.
Das ist bei mir anders.
Die Warnung bekomme ich nur unter 5.10.0, unter 5.8.8 geht's.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel