SELFHTML/Quickbar  CGI/Perl  Perl-Sprachelemente


Dateien lesen und schreiben

Diese Seite ist ein Dokument mit Informationstext

 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