SELFHTML/Quickbar CGI/Perl Perl-Sprachelemente

| ## Dateien lesen und schreiben
| Dateien öffnen und schließen Dateien lesen Daten in Dateien schreiben

## Dateien öffnen und schließen

Mit Perl-Scripts können Sie Dateien verwalten. Im Zusammenhang mit CGI-Scripts können Perl-Scripts Dateien auf dem Server-Rechner lesen und schreiben. Erst dadurch werden so bekannte CGI-Anwendungen wie Zugriffszähler oder Gästebücher möglich.

Jede Datei, die Sie mit einem Perl-Script lesen oder in die Sie Daten schreiben wollen, müssen Sie zuerst öffnen. Nachdem Sie eine Datei ausgelesen oder alle gewünschten Inhalte in die Datei geschrieben haben, sollten Sie die Datei stets wieder schließen.

### Beispiele:

    #!/usr/bin/perl

    open(NEUIGKEITENDATEI, "<news.txt");    # Datei zum Lesen öffnen
    close(NEUIGKEITENDATEI);

    open(NEUIGKEITENDATEI, ">news.txt");    # Datei zum Schreiben öffnen
    close(NEUIGKEITENDATEI);

    open(NEUIGKEITENDATEI, ">>news.txt");    # Datei zum anhängenden Schreiben öffnen
    close(NEUIGKEITENDATEI);

    if(open(COUNTERDATEI, "<counter/counter.dat") == false)
     { print "Counter-Datei nicht gefunden\n"; }

    open(COUNTERDATEI, "<counter/counter.dat") || die "Counter-Datei nicht gefunden\n";

### Erläuterung:

Eine Datei wird mit der Perl-Funktion `open` geöffnet. Die Funktion erwartet zwei Parameter.

Als ersten Parameter vergeben Sie einen Datei-Handler. Das ist ein Name, der benötigt wird, um auf die Datei zugreifen zu können. Den Namen für den Datei-Handler können Sie frei vergeben. Es ist üblich und gehört zum guten Ton, für solche Namen ausschließlich Großbuchstaben zu verwenden. In den obigen Beispielen sind `NEUIGKEITENDATEI` und `COUNTERDATEI` solche Namen.

Als zweiten Parameter erwartet die `open`-Funktion die Angabe eines Dateinamens. Wenn die gewünschte Datei sich in einem anderen Verzeichnis befindet, benutzen Sie das gleichen Adressierungs-Schema wie bei HTML-Verweise zu Dateien in anderen Verzeichnissen. Wichtig ist der einfache Schrägstrich zum Trennen von Verzeichnissen, auch wenn Sie das Perl-Script in einer DOS/Windows-Umgebung laufen lassen.

Vor dem Dateinamen und ggfs. der Pfadangabe notieren Sie noch mit Hilfe von Sonderzeichen, in welchem Modus Sie die Datei öffnen möchten:

`<datei.dat` bedeutet: Datei `datei.dat` nur zum Lesen öffnen. Die Datei muß existieren, ansonsten gibt es einen Fehler.
`>datei.dat` bedeutet: Datei `datei.dat` zum Schreiben von Daten öffnen. Wenn die Datei bereits existiert, wird ihr bisheriger Inhalt überschrieben. Wenn die Datei noch nicht existiert, wird sie automatisch angelegt.
`>>datei.dat` bedeutet: Datei `datei.dat` zum Schreiben von Daten öffnen. Wenn die Datei bereits existiert, wird der neue Inhalt an den alten Inhalt angehängt, d.h. der alte Inhalt wird nicht gelöscht. Wenn die Datei noch nicht existiert, wird sie automatisch angelegt.
`+>datei.dat` bedeutet: Datei `datei.dat` zum Lesen und zum Schreiben von Daten.
`|such.exe` bedeutet: Datei `such.exe` ist eine ausführbare Programmdatei. Das Programm wird geöffnet, um es auszuführen.

### Beachten Sie:

Es ist guter Programmierstil, mögliche Fehler beim Öffnen von Dateien abzufangen und im Perl-Script entsprechend darauf zu reagieren. Die beiden letzten der obigen Beispiele zeigen Anweisungskonstruktionen für solche Fehlerreaktionen. Die erste der beiden Anweisungskonstruktionen arbeitet mit einer bedingten Anweisung und gibt mit Hilfe der print-Funktion eine Fehlermeldung aus, falls das Öffnen der Datei fehlschlägt. Die zweite Anweisungskonstruktion ist ein einfacher logischer Oder-Ausdruck, den der Perl-Interpreter bewertet. Zunächst wird der erste Teil des Ausdrucks (vor dem Oder-Zeichen `||`) bewertet. Das ist der Befehl zum Öffnen der Datei. Gelingt es, die Datei zu öffnen, gibt die `open`-Funktion den Wert "wahr" zurück, und damit ist auch der gesamte logische Ausdruck wahr. Wenn das Öffnen der Datei nicht gelingt, wird der zweite Teil des Ausdrucks bewertet. Dort wird einfach mit Hilfe der `die`-Funktion das Script vorzeitig beendet. Die Funktion `die` (= sterben) beendet ein Perl-Script und gibt auf Wunsch noch einen Text aus, so wie im obigen Beispiel.

## Dateien lesen

Es gibt verschiedene Möglichkeiten, eine Datei einzulesen. Welche Möglichkeit Sie benutzen sollten, hängt von den Aufgaben ab, die das Perl-Script erfüllen soll. Voraussetzung für das Einlesen einer Datei ist, daß die Datei zuvor zum Lesen geöffnet wird.

### Beispiel 1 (Datei zeilenweise einlesen):

    #!/usr/bin/perl

    @Zeilen = ("");
    open(MAILDAT, "<inbox.dat") || die "Datei mit E-Mails nicht gefunden\n";
    while(<MAILDAT>)
     {
      push(@Zeilen,$_);
     }
    close(MAILDAT);
    for(@Zeilen)
     {
      if(/HTML/)
       {
        print $_;
       }
      }

### Beispiel 2 (Datei zeichenweise einlesen):

    #!/usr/bin/perl

    @Vokale = ("a","e","i","o","u");
    @Anzahl = (0,0,0,0,0);
    open(DATEI, "<$ARGV[0]") || die "$_[1] nicht gefunden\n";
    while(($AktuellesZeichen = getc(DATEI)) ne "")
     {
      for($i=0;$i<=4;++$i)
       {
        if($AktuellesZeichen eq $Vokale[$i])
         {
          $Anzahl[$i]++;
         }
       }
     }
    close(DATEI);
    for($i=0;$i<=4;++$i)
     {
      print "$Vokale[$i] kommt in $ARGV[0] isg. $Anzahl[$i] mal vor\n";
     }

### Erläuterung:

Die üblichste Art und Weise, in Perl eine Datei einzulesen, ist das zeilenweise Einlesen, so wie im obigen Beispiel 1. Das funktioniert bei allen Dateien, die man auch in einem Texteditor gut lesen kann, also alle Arten von Textdateien, Konfigurationsdateien oder zeilenartig aufgebaute Datendateien mit Begrenzerzeichen für Felder. Dafür gibt es gar keinen eigenen Lesebefehl in Perl. Sie notieren einfach eine while-Schleife mit der Syntax `while(<DATEIHANDLER>)`, wobei DATEIHANDLER derjenige Name sein muß, den Sie bei `open` vergeben haben. Innerhalb der Schleife können Sie die aktuelle, eingelesene Zeile der Datei über die vordefinierte Variable `$_` ansprechen. Um die Daten im Arbeitsspeicher für die Weiterverarbeitung zu halten, können Sie die Zeilen beispielsweise in eine Liste einlesen, so wie im obigen Beispiel 1.

Binärdateien, also z.B. Dateien mit Dateiformaten bestimmter Anwendungsprogramme, die auch numerische Werte und Steuerzeichen enthalten, lassen sich besser zeichenweise einlesen, so wie im obigen Beispiel 2. Die Perl-Funktion zum Einlesen des jeweils nächsten Zeichens aus einer Datei heißt `getc`. Diese Funktion gibt jeweils das eingelesene Zeichen zurück, das Sie in einer geeigneten Variablen speichern können. Wenn das Dateiende erreicht wurde, gibt die Funktion ein leeres Zeichen (hexadezimal 0) zurück. Deshalb wird im obigen Beispiel 2 in der while-Schleife zum Einlesen der Datei die Abbruchbedingung mit dem folgenden Vergleichsoperator formuliert: `ne ""`.

### Beachten Sie:

Das obige Beispiel 2 zeigt nebenbei, wie Sie in einem Perl-Script eine Datei einlesen können, die dem Script nicht bekannt ist, sondern ihm beim Aufruf als Parameter mit übergeben wird. Die Argumente, die dem Script übergeben werden, sind in Perl in der vordefinierten Liste `@ARGV` gespeichert.

## Daten in Dateien schreiben

Je nachdem, in welchem Modus Sie eine Datei zum Schreiben geöffnet haben (siehe Dateien öffnen), wird eine bereits vorhandene Datei beim Schreiben von Daten in die Datei überschrieben, oder die neuen Daten werden hinten angehängt.

### Beispiel:

    #!/usr/bin/perl
    # Dieses Beispiel liest eine kommabegrenzte Datei mit Adressen ein
    # und schreibt sie HTML-formatiert in eine neue Datei

    @Adressen = ("");    # Speicher für alle Datensaetze
    @Datensatz = ("");   # Speicher für alle Felder des aktuellen Datensatzes
    $Felder = "";        # Speicher für die Namen der Felder (stehen in der ersten Dateizeile
    $i = 0;
    open(ADRESSEN, "<adressen.csv") || die "Adressendatei nicht gefunden\n";
    while(<ADRESSEN>)              # Kommabegrenzte Datei einlesen
     {
      if($i == 0)                  # erste Zeile der Datei einlesen
       {
        $Felder = $_;              # Feldnamen ermitteln
       }
      else
       {
        $Adressen[$i] = $_;        # ab zweiter Zeile in @Adressen einlesen
       }
      $i++;                        # Datensatzzähler erhöhen
     }
    close(ADRESSEN);
    $Anzahl = $i - 1;              # Anzahl Datensätze merken
    chop($Felder);
    @Datenfelder = split(/,/,$Felder);    # Erste Zeile mit Feldnamen aufdröseln

    open(ADRESSENDAT, ">adressen.htm");   # HTML-Datei zum Schreiben öffnen
    print ADRESSENDAT "<html>\n<head>\n";  # HTML-Datei schreiben
    print ADRESSENDAT "<title>Adressen</title>\n";
    print ADRESSENDAT "</head>\n<body bgcolor=#FFFFFF>\n";
    for(@Adressen)                        # solange Daten in der Adressenliste sind
     {
      @Datensatz = split(/,/,$_);         # Aktuellen Datensatz aufdröseln
      $i = 0;
      for(@Datensatz)
       {
        print ADRESSENDAT "<b>$Datenfelder[$i]:</b> $Datensatz[$i]<br>\n";   # Aktuellen Datensatz schreiben
        $i++;
       }
     }
    print ADRESSENDAT "</body>\n</html>\n";
    close(ADRESSENDAT);
    print $Anzahl," Datensaetze geschrieben\n";   # Nur zur Kontrolle: auf Standardausgabe

### Erläuterung:

Um Daten in Dateien zu schreiben, wird in Perl normalerweise die `print`-Funktion verwendet. Im Gegensatz zu Ausgaben auf die Standardausgabe muß beim Schreiben in eine Datei jedoch hinter `print` der Name des Dateihandlers notiert werden, der beim Öffnen der Datei vergeben wurde. Im obigen Beispiel wird im unteren Teil die Datei `adressen.htm` zum Schreiben geöffnet. Dabei erhält Sie als Dateihandler den Namen ADRESSENDAT. Mit `print ADRESSENDAT "Daten..."` werden Daten in die Datei `adressen.htm` geschrieben.

weiter: | Zeichenketten und Listen manipulieren
zurück: | Unterprogramme und Perl-Funktionen

SELFHTML/Quickbar CGI/Perl Perl-Sprachelemente

© 1998 Stefan Münz, muenz@csi.com