String aus Datei einlesen und verwenden können
Sven H.
- cgi
Hi, ich habe folgendes Problem:
Ein Script innerhalb einer meiner pl-Dateien liest aus einer Datei eine Zahl aus.
open (FH, "< forum/IDforum.txt");
$kennung = <FH>; chomp $kennung;
close FH;
Diese Zahl wird anschließend an einen Dateinamen gehängt, um diesen zu vervollständigen:
open (FHa, "< forum/F" . $kennung) or $loaderror=1;
Es tritt leider NIE das gewünschte Ergebnis ein.
Die Datei wird nur geöffnet, wenn ich die Zahl, die in der Datei gespeichert war, der Variable $kennung direkt zuweise und den Wert nicht über $kennung=<FH> einlese.
Gibt es außer der Notwendigkeit des chomp-Befehls noch andere bekannte Tücken bei Strings?
Für jeden Hinweis bin ich dankbar.
Vielen Dank im voraus.
Sven
Hallo Sven,
open (FH, "< forum/IDforum.txt");
besser: open (FH, "< forum/IDforum.txt") || die "can't open file\n";
Diese Zahl wird anschließend an einen Dateinamen gehängt, um diesen zu vervollständigen:
open (FHa, "< forum/F" . $kennung) or $loaderror=1;
Die Datei wird nur geöffnet, wenn ich die Zahl, die in der Datei gespeichert war, der Variable $kennung direkt zuweise und den Wert nicht über $kennung=<FH> einlese.
Du solltest immer alle möglichen Fehler abfangen. Dein konkretes Problem ist vielleicht die Datei forum/IDforum.txt: Es ist möglich das unerwartete Effekte auftreten, wenn die Datei nicht mit einem Zeilenumbruch (\n) endet. Ansonsten sieht alles logisch aus.
Grüße Peter
Halihallo Sven
open (FH, "< forum/IDforum.txt");
$kennung = <FH>; chomp $kennung;
close FH;
das müsste so aussehen:
open(FH, '<./forum/IDforum.txt') or die 'cannot open IDforum.txt';
($kennung) = <FH>; chomp $kennung;
close FH;
Beachte: <FH> gibt ein Array zurück, nicht ein String. Benutzt du <FH> skalar, wird die _Länge_ des Arrays (also Anzahl Zeilen in der Datei) zurückgeliefert.
Viele Grüsse
Philipp
Halihallo Sven
open (FH, "< forum/IDforum.txt");
$kennung = <FH>; chomp $kennung;
close FH;
das müsste so aussehen:
open(FH, '<./forum/IDforum.txt') or die 'cannot open IDforum.txt';
($kennung) = <FH>; chomp $kennung;
close FH;
Beachte: <FH> gibt ein Array zurück, nicht ein String. Benutzt du <FH> skalar, wird die _Länge_ des Arrays (also Anzahl Zeilen in der Datei) zurückgeliefert.
Leider falsch!
Nur weil <FH> im Array-Kontext ein Array zurückliefert, muß es im Scalar-Kontext nicht die Länge des Arrays liefern. Es liefert die nächste Zeile zurück, oder undef bei Fehlern wie EOF.
Oder, als RTFM formuliert:
perldoc perlop
Unter I/O Operators findet sich folgende Erklärung:
In scalar context, evaluating a filehandle in angle brackets yields the next line from that file (the newline, if any, included), or undef at end-of-file or on error. When $/ is set to undef (sometimes known as file-slurp mode) and the file is empty, it returns '' the first time, followed by undef subsequently.
Alexander
Viele Grüsse
Philipp
Halihallo Alexander
das müsste so aussehen:
open(FH, '<./forum/IDforum.txt') or die 'cannot open IDforum.txt';
($kennung) = <FH>; chomp $kennung;
close FH;
Beachte: <FH> gibt ein Array zurück, nicht ein String. Benutzt du <FH> skalar, wird die _Länge_ des Arrays (also Anzahl Zeilen in der Datei) zurückgeliefert.
Leider falsch!
[...]
Öm. Ich entschuldige mich; hast recht.
Aber vielleicht ist es anders (also im array-kontext) dennoch sinnvoll, denn dann gewöhnt man sich das gleich an (wie ich) und staunt dann an anderen Orten nicht. (soll keine Ausrede sein, ich gestehe den Fehler voll und ganz ein)
Viele Grüsse
Philipp
Halihallo Alexander
Moin Moin !
das müsste so aussehen:
open(FH, '<./forum/IDforum.txt') or die 'cannot open IDforum.txt';
($kennung) = <FH>; chomp $kennung;
close FH;
Beachte: <FH> gibt ein Array zurück, nicht ein String. Benutzt du <FH> skalar, wird die _Länge_ des Arrays (also Anzahl Zeilen in der Datei) zurückgeliefert.
Leider falsch!
[...]
Öm. Ich entschuldige mich; hast recht.
Aber vielleicht ist es anders (also im array-kontext) dennoch sinnvoll, denn dann gewöhnt man sich das gleich an (wie ich) und staunt dann an anderen Orten nicht. (soll keine Ausrede sein, ich gestehe den Fehler voll und ganz ein)
Das ist guuuuuuuuut für mein Ego ! ;-)
Statt "open FH", "<FH>" und Co. kann man natürlich gleich sauber und ordentlich IO::File, IO::Handle und Co. benutzen.
Nochmal RTFM: perldoc IO::Handle
$io->getline
This works like <$io> described in I/O Operators in the perlop manpage except that it's more readable and can be safely called in an array context but still returns just one line.
$io->getlines
This works like <$io> when called in an array context to read all the remaining lines in a file, except that it's more readable. It will also croak() if accidentally called in a scalar context.
Aber für schnelle Hacks ist IO::Handle definitiv etwas zu viel Tipperei.
Alexander
Re: Halihallo
Öm. Ich entschuldige mich; hast recht.
Aber vielleicht ist es anders (also im array-kontext) dennoch sinnvoll, denn dann gewöhnt man sich das gleich an (wie ich) und staunt dann an anderen Orten nicht. (soll keine Ausrede sein, ich gestehe den Fehler voll und ganz ein)
Das ist guuuuuuuuut für mein Ego ! ;-)
Braucht jeder mal... Aber das nächste mal lässt du gefälligst mich recht haben :-))
Statt "open FH", "<FH>" und Co. kann man natürlich gleich sauber und ordentlich IO::File, IO::Handle und Co. benutzen.
Ja, ja, good old OOP...
$io->getline
This works like <$io> described in I/O Operators in the perlop manpage except that it's more readable and can be safely called in an array context but still returns just one line.
$io->getlines
This works like <$io> when called in an array context to read all the remaining lines in a file, except that it's more readable. It will also croak() if accidentally called in a scalar context.
Aber für schnelle Hacks ist IO::Handle definitiv etwas zu viel Tipperei.
dafür elegant... Ich hatte mich früher mal gefragt, warum das alles noch programmiert worden ist; es gab ja bereits für alles built-in Prozeduren... Heute weiss ich: Es ist schön, wenn man in Perl alles modularisiert (objektorientiert) hat, sieht einfach besser aus. Also für den Dateizugriff verwende ich zwar immer noch die guten, alten, einfachen Methoden, jedoch für alle meine Projekte verwende ich eigentlich nur noch OOP.
Viele Grüsse
Philipp