zurückInhaltvorwärts Perl Einführung: Arbeiten mit Dateien

10.1 Arbeiten mit Dateien

Betrachte das folgende kleine Perlskript:

$pfad ="c:\\readme.txt";

open(DATEI, $pfad);
@inhalt=<DATEI>;
close(DATEI);

foreach $zeile (@inhalt) {
  print "$zeile\n";
}

Die erste Zeile definiert die Variable $pfad als den Pfad zu der Datei readme.txt (beachte, daß dem \ ein weiteres \ vorangestellt werden muß, damit es auch wirklich als \ interpretiert wird). Der open Befehl in der nächsten Zeile öffnet die Datei readme.txt in C:\ zum lesen und verknüpft die Datei mit einem sogenannten Dateihandle. Die Datei kann nun über diesen Alias angesprochen werden.

In unserem Fall lautet der Dateihandle schlicht DATEI. Der Dateihandle ist willkürlich gewählt. Wir hätten ihn auch MICKEYMAUS oder HELMUTKOHL nennen können. Du solltest Dateihandles immer GROß schreiben. Einen speziellen Dateihandle kennst Du eigentlich schon aus Kapitel 4 : <STDIN> ist das Dateihandle, das den Standard Input, also die Tastatur bezeichnet. Wir hatten ihn behandelt, als wir über Benutzereingaben sprachen.

In der nächsten Zeile, @inhalt=<DATEI>, wird der Inhalt der Datei in einem Rutsch in den array @inhalt gelesen, d.h. die erste Zeile von readme.txt ist das erste Element von @inhalt, die zweite Zeile von readme.txt ist das zweite Element von @inhalt etc. Beachte hierbei, daß das Einlesen aus readme.txt über den Dateihandle, dem Alias, DATEI in spitzen Klammern geschieht.

In der close Anweisung wird schließlich die Datei geschlossen, da der Lesevorgang beendet ist. Auch hier wird readme.txt über den Dateihandle DATEI angesprochen. Vergiß nicht eine Datei nach dem öffnen auch wieder zu schließen.

Die foreach Schleife ist wieder eine alte Bekannte: $zeile durchläuft elementweise den Array @inhalt und enthält die aus readme.txt eingelesenen Zeilen, die im Schleifenkörper ausgegeben werden. Du erinnerst Dich noch sicherlich, daß \n für ein newline steht, also einen Sprung in die nächste Zeile darstellt.

Wenn man schreibend auf eine Datei zugreifen will, kann man dies wie folgt tun:

$pfad ="c:\\ergebnis.txt";

open(DATEI, ">$pfad");
for($i=0;$i<=10;$i++) {
  $j=$i*$i;
  print DATEI "Das Quadrat von $i ist $j\n";
}

close(DATEI);

Wenn Du eine Datei zum schreiben öffnen willst, mußt Du der Variablen $pfad ein > Zeichen voranstellen und den Ausdruck >$pfad in Anführungszeichen setzen. In der nächsten Zeile werden mit einer for Schleife die Zahlen von 0 bis 10 durchlaufen. Im Schleifenkörper wird das Quadrat des jeweiligen Indexes $i berechnet. In anschließenden Zeile wird mittels des gewöhnlichen print Befehls die Zeichenkette Das Quadrat von $i ist $j\n in die Datei ergebnis.txt geschrieben. Beachte hierbei, daß hier dem print Befehl nachgestellte Dateihandle DATEI: Dies bewirkt, daß in die Datei geschrieben wird und nicht auf den Bildschirm. Wenn Du die Datei ergebnis.txt aufrufst, wirst Du das folgende Listing sehen:

Das Quadrat von 0 ist 0
Das Quadrat von 1 ist 1
Das Quadrat von 2 ist 4
Das Quadrat von 3 ist 9
Das Quadrat von 4 ist 16
Das Quadrat von 5 ist 25
Das Quadrat von 6 ist 36
Das Quadrat von 7 ist 49
Das Quadrat von 8 ist 64
Das Quadrat von 9 ist 81
Das Quadrat von 10 ist 100

Du fragst Dich vielleicht, was passiert, wenn die Datei ergebnis.txt in C:\ nicht existiert, wenn Du anfangen willst in sie zu schreiben. Du brauchst Dir hierüber keine Sorgen zu machen: Wenn sie nicht existiert, wird sie erzeugt. Du solltest Dich allerdings sorgen, wenn Sie existiert! In diesem Falle wird nämlich, ohne vorherige Nachfrage des Dich umsorgenden Betriebssystems der Inhalt der Datei schlicht gelöscht (probier dies mal mit der Datei boot.ini aus ;-)).

Es mag nicht immer Sinn machen, den Inhalt einer Datei immer wieder zu löschen und zu ersetzen. Stelle Dir vor, Du legst in einer Datei Adressen ab. Sicherlich willst Du nicht, daß jedesmal wenn Du eine neue Adresse hinzufügst, die alten überschreiben werden. Das folgende Listing zeigt Dir, wie man so etwas macht:

$pfad="C:\\notizblock.txt";
open(HELMUTKOHL, ">>$pfad");

do {
  print "Bitte geben Sie eine Notiz ein. Drücken Sie die <RETURN> Taste, wenn Sie keine Eingaben mehr wü: ";
  $notiz=<STDIN>;
  print HELMUTKOHL "Eintrag: $notiz\n";
} while ($notiz eq "\n");

close(HELMUTKOHL);

Der entscheidende Punkt ist hier das doppelte > in dem Ausdruck ">>$pfad", welches die Datei zum anhängenden schreiben öffnet. Innerhalb der do while Schleife (siehe Kapitel 5.3) wird mittels $notiz=<STDIN> solange nach einer Notiz gefragt bis der User die RETURN Taste drückt, um den Eingabevorgang abzuschließen; dies wird am Fuß der Schleife durch while ($notiz eq "\n") geleistet. Jede Eingabe $notiz wird innerhalb des Schleifenkörpers über den Dateihandle HELMUTKOHL der Datei notizblock.txt angehängt.

Übung 1
Schreibe ein Skript, das den Inhalt einer Datei quelle.txt ausliest und anschließend an eine Datei ziel.txt anhängt.

Perl Einführung: Arbeiten mit Dateien zurückInhaltvorwärts