Perl-Programmierung: Dateien

Aus Wikibooks

Wechseln zu: Navigation, Suche
Zurück zu Einfache Ein-/Ausgabe | Hoch zu Inhaltsverzeichnis | Vor zu Operatoren



Inhaltsverzeichnis

[Bearbeiten] Dateitest-Operatoren

Ein Dateizugriff ist ein sehr systemnaher Vorgang. Zugriffe auf nichtexistente Dateien können zu Abstürzen unseres Programms führen. Um das zu vermeiden muß unser Perl-Programm sich häufig zur Laufzeit, vor dem eigentlichen Dateizugriff, informieren, was genau auf dem Dateisystem los ist. Dazu muß der Programmierer seinem Programm die richtigen Fragen an die Hand geben.

Perl stellt eine ganze Reihe von Operatoren zur Verfügung um Dateien zu testen. Diese sogenannten Dateitest-Operatoren ( auch -X-Operatoren genannt ) ermöglichen es dem Programmierer, zu überprüfen wie der Zustand einer Datei ist. Hier eine komplette Liste der vorhandenen Operatoren:

-r   Datei / Verzeichnis ist für effektiven Benutzer oder Gruppe lesbar
-w   Datei / Verzeichnis ist für effektiven Benutzer oder Gruppe schreibbar
-x   Datei / Verzeichnis ist für effektiven Benutzer oder Gruppe ausführbar
-o   Datei / Verzeichnis gehört effektivem Benutzer
-R   Datei / Verzeichnis ist für tatsächlichen Benutzer oder Gruppe lesbar
-W   Datei / Verzeichnis ist für tatsächlichen Benutzer oder Gruppe schreibbar
-X   Datei / Verzeichnis ist für tatsächlichen Benutzer oder Gruppe ausführbar
-O   Datei / Verzeichnis gehört tatsächlichem Benutzer
-e   Datei / Verzeichnis existiert
-z   Datei existiert und hat die Größe null ( für Verzeichnisse immer unwahr )
-s   Datei existiert und hat eine andere Größe als null ( Wert ist Größe in Bytes )
-f   Angabe ist eine "einfache" Datei
-d   Angabe ist ein Verzeichnis
-l   Angabe ist ein symbolischer Link
-S   Angabe ist ein Socket
-p   Angabe ist eine benannte Pipe ( fifo )
-b   Angabe ist eine spezielle Blockdatei
-c   Angabe ist eine zeichenorientierte Datei
-u   Datei / Verzeichnis ist setuid
-g   Datei / Verzeichnis ist setgid
-k   Datei / Verzeichnis hat das "Sticky Bit" gesetzt
-t   Dateihandle ist ein TTY
-T   Datei sieht aus wie eine Text-Datei
-B   Datei sieht aus wie eine Binär-Datei
-M   "Alter" der Datei ( in Tagen )
-A   Zeit des letzten ( in Tagen )
-C   Letzte Änderung des Inode ( in Tagen )

Hier ein Beispiel um die Funktion dieser Operatoren zu erläutern:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # überprüfen ob Datei existiert
  5.  
  6. my $datei = "/tmp/testfile";
  7. if ( -e $datei ) {
  8.     print "Datei existiert\n";
  9. }

[Bearbeiten] Dateien öffnen und schließen

Um eine Datei zu öffnen benutzt man in Perl die open-Funktion, zum Schließen die close-Funktion.


  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # Datei überprüfen und öffnen
  5.  
  6. my $datei = "/tmp/testfile";
  7. if ( -e $datei ) {
  8.     print "Datei $datei existiert\n";
  9.     open FILE, $datei or die "Kann Datei $datei nicht oeffnen: $!";
  10.     close FILE;
  11. }
  12. else {
  13.   print "Datei $datei existiert nicht\n";
  14. }

In diesem Beispiel wird zuerst überprüft, ob die Datei existiert. Nachdem dieser Test erfolgreich ist, wird die entsprechende Meldung ausgegeben und direkt im Anschluss die Datei geöffnet (standardmäßig im Read-Modus). Würde das fehlschlagen, würde das Programm mit entsprechender Fehlermeldung versterben (die). Zuletzt wird das File wieder geschlossen.

[Bearbeiten] Modi für Dateihandles

Im obrigen Beispiel wurde eine Datei standardmäßig lesend geöffnet. Was ist jedoch, wenn wir eine Datei schreibend öffnen wollen ( zB um ein Logfile zu schreiben )? Für diese Aufgabe gibt es die sogenannten Modi mit denen eine Datei geöffnet werden kann. Hier die Übersicht:

<   Pfad     Zugriff nur lesend
>   Pfad     Zugriff nur schreibend ( neu anlegen / bestehende Datei überschreiben )
>>  Pfad     Zugriff nur schreibend ( neu anlegen / an bestehende Datei anhängen )
+<  Pfad     Lese-/Schreibzugriff
+>  Pfad     Lese-/Schreibzugriff ( neu anlegen / bestehende Datei überschreiben )
+>> Pfad     Lese-/Schreibzugriff ( neu anlegen / an bestehende Datei anhängen )
| Befehl     Schreibhandle an Befehl
Befehl |     Lesehandle von Befehl

Somit könnte man das obige Beispiel auch wie folgt schreiben:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # Datei überprüfen und öffnen
  5.  
  6. my $datei = "/tmp/testfile";
  7. if ( -e $datei ) {
  8.     print "Datei $datei existiert\n";
  9.     open FILE, "< $datei" or die "Kann File nicht oeffnen: $!";
  10.     close FILE;
  11. }

[Bearbeiten] Dateien schreiben

Jetzt, wo wir wissen, wie man eine Datei entweder lesend oder schreibend öffnet, wollen wir natürlich auch etwas mit diesen Dateien anstellen. Im nächsten Beispiel schreiben wir eine Zeile in ein File:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # in Datei schreiben
  5.  
  6. my $datei = "/tmp/testfile";
  7. if ( -e $datei ) {                                                   # Wenn Datei existiert, tun wir garnichts
  8.     print "Datei $datei existiert\n";
  9. }
  10. else {                                                               # Wenn Datei nicht existiert, öffnen, bzw. anlegen.
  11.     open FILE, "> $datei" or die "Kann Datei $datei nicht oeffnen: $!\n";
  12.     print FILE "Eine tolle Zeile voller toller Zeichen!\n";           # hier schreiben wir rein
  13.     close FILE;
  14. }

Wie man sieht, ist das Schreiben in eine Datei kinderleicht. Man kann der print-Funktion das Dateihandle übergeben und es einfach hineinschreiben lassen. Achtung: Kein Beistrich!

[Bearbeiten] Dateien auslesen

Einfach nur eine Datei zu schreiben scheint aber auch langweilig, also wollen wir im nächsten Schritt eine Zeile aus einer Datei einlesen.

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # eine Zeile auslesen
  5.  
  6. my $datei = "/tmp/testfile";
  7. if ( -e $datei ) {
  8.     print "Datei $datei existiert\n";
  9.    
  10.     open FILE, "< $datei", or die "Fehler beim Oeffnen: $!";
  11.     my $line = <FILE>;
  12.     print $line;
  13.     close FILE;
  14. }

Dieses Beispiel gibt die erste Zeile von /tmp/testfile zurück. Nun ist das zwar nett, aber eventuell unzureichend für unseren Geschmack, also lesen wir im nächsten Beispiel die komplette Datei aus.

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. # Datei auslesen
  5.  
  6. my $datei = "/tmp/testfile";
  7. if ( -e $datei ) {
  8.     print "Datei $datei existiert\n";
  9.    
  10.     open FILE, "< $datei", or die "Fehler beim Oeffnen: $!";
  11.     while (<FILE>) {
  12.         print $_;
  13.     }
  14.     close FILE;
  15. }

Das gibt die gesamte Datei aus.

Zurück zu Einfache Ein-/Ausgabe | Hoch zu Inhaltsverzeichnis | Vor zu Operatoren


Persönliche Werkzeuge
Buch erstellen