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:

Zurück zum Anfang dieses Projekts.