FilehandlesPerl

Mit einem Filehandle kann Perl auf Files des Betriebssystems zugreifen. Der Name eines Filehandles beginnt mit keinem Sonderzeichen - mal was Neues. Es wird aber vorgeschlagen und empfohlen, dass der Name eines Filehandles nur aus Großbuchstaben besteht. (Ein Grund kann sein: In der Version Perl-XXX wird ein neuer Befehl - diese sind in Perl i. A. klein geschrieben - eingeführt, der eben genauso heißt wie der Filehandle; dies führt zu einem Fehler.)

SeitenanfangSeitenendeÖffnen und Schließen

Einen Filehandle öffnet man mit dem Operator open():

open(DATEI,"readme.txt");

Es wird die Datei readme.txt zum Lesen geöffnet. Mit dem Filehandle DATEI kann man vom Perlprogramm aus auf die Datei zugreifen.

Will man die gleiche Datei zum Schreiben öffnen, so muss vor dem Dateinamen noch ein Größerzeichen > (das bewirkt ein Überschreiben) bzw. zwei Größerzeichen >> (um Anzuhängen) gestellt werden:

open(DATEI2,">readme.txt");  # Überschreiben
open(DATEI3,">>readme.txt"); # Anhängen

Der Operator open gibt true zurück, falls es gelungen ist die Datei zu öffnen.

Mit dem close()-Operator wird ein Filehandle geschlossen:

close(DATEI1);
close(DATEI2);
close(DATEI3);

Noch ein Beispiel:

open(MYFILE,">test.txt") ||
  die("Programmabbruch: Konnte die Datei test.txt nicht öffnen");

...
close(MYFILE);
Bemerkungen: Wird der Fall, dass ein Filehandle nicht geöffnet werden kann, nicht berücksichtigt, so ignoriert Perl dies einfach und denkt, es hat ein leeres File vor sich - beim Lesen - bzw. es wird ins Leere geschrieben - beim Schreiben oder Anhängen.
Genauso wie open einen Rückgabewert liefert, macht das auch close. Man kann analog testen, ob ein File richtig geschlossen wurde. Dies empfielt sich z. B. beim Schreiben von Files.

SeitenanfangSeitenendeLesen und Schreiben

Also Öffnen und Schließen können wir jetzt. Lesen sollten wir aber auch können. Ähnlich wie beim <STDIN>-Operator und Lesen von der Standardeingabe kann das mit einem Filehandle auch bewerkstelligt werden:

open(PERLPROGRAMM,"I_am.pl") || # zum Lesen geöffnet
  die("Cannot open file I_am.pl for reading!");

$i=0;
while($eingabe=<PERLPROGRAMM>){
  $i++;
  chomp($eingabe);
  print "$i-te Zeile: $eingabe\n";
}

# kürzer geht es so:
$i=0;
while(<PERLPROGRAMM>){
  $i++;
  chomp;
  print "$i-te Zeile: $_\n";
}

close(PERLPROGRAMM);

Auf eine Datei schreibt man mit dem print-Operator. Man öffnet ein Filehandle zum Schreiben oder Anhängen und übergibt es dem print-Operator als erstes Argument. Das zweite enthält dann den Text, der geschrieben werden soll:

open (IAM,">I_am.txt"); # öffnen zum Schreiben
  print IAM "Joachim Braun\n".
    "Tel.: 0921/000 000 000\n".
    "95448 Bayreuth\n";
close (IAM);

open (IAMADD,">>I_am.txt"); # öffnen zum Anhängen
  print IAMADD "\nperl@btm2x2.mat.uni-bayreuth.de\n";
close (IAMADD);

Ein weiteres Beispiel: Kopieren einer Datei mit Hilfe von Filehandles.

open (INPUTFILE,"I_am.txt") ||    # öffne zum Lesen
  die("Can't open source-file I_am.pl!");
open (NEWFILE,">you_are.txt") || # öffne Ausgabefile
  die("Can't open output-file you_are.txt!");

while($zeile=<INPUTFILE>){
  print NEWFILE $zeile;
}

close(INPUTFILE);
close(NEWFILE) ||
  die("Can't close output-file you_are.txt!");

SeitenanfangSeitenendeTests für Dateien

Perl bietet eine Möglichkeit an, um Tests an Dateien durchzuführen. Dazu sind Operatoren der Form -Buchstabe eingeführt worden. Hier seien einige davon erwähnt:

Operator Bemerkung Beispiel
-e existiert die Datei oder das Verzeichnis if (-e "I_am.txt") { ... }
-r Datei oder Verzeichnis ist lesbar if (-r 'c:\temp') { ... }
-w Datei oder Verzeichnis ist schreibbar
-x Datei oder Verzeichnis ist ausführbar
-f ist eine normale Datei
-d ist ein Verzeichnis
-T Die Datei enthält Text
-B die Datei ist eine Binärdatei
Bemerkung: Man kann diese Operatoren auch auf Filehandles anwenden!

Will man mehrere Tests für die gleiche Datei machen (z. B. mit if (-r 'I_am.pl' && -w 'I_am.pl')), so holt Perl zweimal Informationen über diese Datei vom Betriebssystem. Das kostet Zeit! Mit dem Filehandle _ veranlasst man Perl, dass er die Infos des vorherigen Tests verwendet:

$Iam='I_am.txt';
if (-r $Iam && -w _){
  print "$Iam ist lesbar und schreibbar!";
}

Seitenanfang FehlermeldungHilfe zur Fehlermeldung © 2001-2003 Email an den AutorPerl, Lehrstuhl Mathe II, Uni Bayreuth