Webbasierte Adressdatenbank
Was sind Filehandles?
Ein File oder Dateihandle ist der Name für die Ein/Ausgabeverbindung des Perl Programmes mit
der Außenwelt. Standardfilehandles sind STDIN
(normalerweise Tastatur),
STDOUT
(normalerweise Bildschirm das bedeutet im allgemeinen die aufrufende Shell)
und STDERR
(Standardfehler). Die Namen von Filehandles sind unabhängig vom Namensraum
von Variablen, können also gleich sein. Üblicherweise verwendet man große Buchstaben
für Filehandles.
Wie verwendet man Filehandles?
Hier mal ein kleines Beispiel, das eine Datei öffnet, und die Zeilen zählt:
#!/usr/bin/perl -w use strict; my $file = 'demo.dat'; my $cnt = 0; open(FILE, $file) || die "Kann $file nicht oeffnen: $!"; while (<FILE>) { $cnt++; } close(FILE) || die "Kann $file nicht schliesen $!"; print "$cnt Zeilen\n";
Wenn man ein Filehandle öffnet ohne zu prüfen, ob dies erfolgreich war, so kann man aus einem nicht
existierenden File lesen, und erhält immer automatisch EOF
end of file. Man kann auch
schreiben, die Daten fallen dabei unter den Tisch. Verwendet man den -w
Switch bekommt man
schon eine Fehlermeldung Read on closed Filehandle...
. Setzt man nun noch
|| die "...$!"
("oder sterbe")
ein, so erhät man
folgende Meldung Kann demo.dat nicht oeffen: No such file or directory at ./demo.pl line...
.
Das $!
ist eine Standardvariable und steht im numerischern Kontext für die
Fehlernummer errno
, im Stringkontext für den Fehlertext. Die
while
Schleife wird nun solange durchlaufen, wie
das Filehandle nicht EOF
zurück gibt.
Das nächste Beispiel zeigt, wie man eine Datei liest und in eine andere Datei schreibt:
#!/usr/bin/perl -w use strict; my $infile = 'demo.dat'; my $outfile = 'neu.dat'; open(LESEN, $infile) || die "Kann $infile nicht oeffnen: $!"; open(SCHREIBEN, ">$outfile") || die "Kann $outfile nicht oeffnen: $!"; while (<LESEN>) { print SCHREIBEN $_ } close(LESEN) || die "Kann $infile nicht schliesen $!"; close(SCHREIBEN) || die "Kann $outfile nicht schliesen $!";
Das Öffnen und Schliesen der Dateien geschieht wie im ersten Beispiel. Die while
Schleife liefert hier solange die gerade gelesene Zeile zurück, bis EOF
erreicht
wird. Wird das Ergebnis der Bedingung (<LESEN>)
nicht explizit einer Variablen
zugeordnet, landet dies automatisch in der Variable $_
, der Defaultvariablen und
Suchraum für die Mustersuche.
Als letztes soll nun ein Beispiel folgen, das einen Filenamen von STDIN
entgegen
nimmt, testet, ob das File existiert und lesbar ist und die Zeilen mit Nummern versehen auf
STDOUT
ausgibt:
#!/usr/bin/perl -w use strict; my $file; print "Welche Datei? "; chomp ($file = <STDIN>); my $cnt = 0; if (-r $file) { open(FILE, $file) ||die "Kann $file nicht oeffen. $!"; while (<FILE>) { $cnt++; print "Zeile $cnt: $_"; # davon ausgehend, das $_ mit \n endet } close(FILE); } else { print "File existiert nicht, oder kann nicht gelesen werden\n"; }
Zur Errinerung: die Funktion chomp()
entfernt den Zeilenvorschub (egal ob \n in
Linux oder \r\n in Windows), dies funktioniert sowohl mit Skalaren als auch mit Arrayvariablen (hier wird
dann aus jedem Arrayelement der Zeilenvorschub entfernt). Der Test if (-r $file)
liefert wahr zurück, wenn das File existiert und gelesen (r) werden kann.
Literaturhinweise:
- Perl-Online-Dokumentation von Eike Grote
- Perlfaq 5 aus dem CPAN
- Perlfaq 5 aus der eigenen Perldoku mit perldoc perlfaq5 aufrufen
Zurück zum Anfang dieses Projekts.