Perl - Dateien und Verzeichnisse

[ <= ] [ HOME ] [ INHALT ] [ INDEX ] [ => ]

Globbing

In einer UNIX-Shell gibt es die Möglichkeit, eine Liste von Files zu erhalten, indem man ein Muster vorgibt, das Platzhalter wie * oder ? enthält. So liefert

ls -1 *.html

eine einspaltige Liste aller Files, die auf .html enden.

Einen analogen Mechanismus gibt es in Perl durch die Funktion glob() sowie den sog. Rhombus-Operator <>. Obiges Shell-Beispiel läßt sich dann wie folgt implementieren:

#!/usr/local/bin/perl -w

foreach $filename (glob("*.html")) {
  print $filename."\n"
}

Oder auch:

#!/usr/local/bin/perl -w

foreach $filename (<*.html>) {
  print $filename."\n"
}

Man kann auch die Fileliste direkt an ein Array übergeben:

#!/usr/local/bin/perl -w

@fileliste = glob("*.html");
foreach $filename (@fileliste) {
  print $filename."\n"
}

Selbst Variablen können im Dateimuster verwendet werden:

#!/usr/local/bin/perl -w

$pfad = 'perl';
@fileliste = <$pfad/*.html>;
foreach $filename (@fileliste) { print $filename."\n" }

$muster = '*.html';
@fileliste = <${muster}>;           # Spezialfall ...
foreach $filename (@fileliste) { print $filename."\n" }

Im obigen Beispiel muß im zweiten Teil <${muster}> anstelle von <$muster> stehen, da hier eine Variable alleine im Rhombus-Operator steht.

Wer es etwas genauer wissen will: in einem Ausdruck wie <$muster> wird $muster als "indirektes Filehandle" betrachtet. Damit kann man beispielsweise Filehandles als Parameter an Unterprogramme übergeben.

Beispiel:

#!/usr/local/bin/perl -w

open(FILE,'test.dat');
print_file(\*FILE);
close(FILE);

sub print_file {
    my $handle = $_[0];
    while(<$handle>) { print }
}


[ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ]

Verzeichnisse

Ähnlich wie man Dateien zum Lesen öffnen kann, lassen sich auch Verzeichnisse behandeln, um auf die Dateinamen des Ordnerinhalts zugreifen zu können.

Beispiel:

#!/usr/local/bin/perl -w

opendir(DIR,"perl");
while($datei = readdir(DIR)) { print $datei."\n" }
closedir(DIR);

Mit opendir() wird dabei das Verzeichnis geöffnet. Das erste Argument ist hierbei das sog. "Directoryhandle", dessen Name (aus Gründen der Konvention) aus Großbuchstaben bestehen sollte. Die Funktion readdir() liefert dann die einzelnen Einträge des Ordners. closedir() schließlich beendet den Zugriff auf das Verzeichnis.

Das aktuelle Verzeichnis kann durch `pwd` bestimmt werden. Zu beachten sind hier die sog. backquotes (``) ! Sie bewirken, daß die eingeschlossene Zeichenkette als Kommando an das Betriebssytem weitergegeben wird. Das Ergebnis des Kommandos wird dann zurückgeliefert.

Beispiel:

#!/usr/local/bin/perl -w

$akt_verz = `pwd`;
print "aktuelles Verzeichnis : $akt_verz\n";

Ein Verzeichniswechsel ist durch die Funktion chdir() möglich. Dies ist allerdings abhängig vom Betriebssystem, unter dem Perl gerade läuft, wobei insbesondere auf das Zeichen zu achten ist, das Datei-/Verzeichnisnamen im Pfad voneinander trennt.

Als Beispiel seien hier UNIX und MacOS gegenübergestellt:

                       | UNIX              | MacOS
 ----------------------+-------------------+---------------------
  Pfad-Trennzeichen    | /                 | : 
                       |                   |
  Wechseln in höheres  | chdir('..');      | chdir('::');   
  Verzeichnis          |                   |
                       |                   |
  Öffnen des aktuellen | opendir(ABC,'.'); | opendir(ABC,':');
  Verzeichnisses       |                   |


[ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ]

Dateifunktionen

Zum Arbeiten mit Dateien gibt es folgende Funktionen; abhängig vom Betriebssystem stehen nicht immer alle zur Verfügung (z.B. gibt es keine Hard Links auf der Macintosh-Plattform):


[ <= ] [ <- ] [ HOME ] [ INHALT ] [ INDEX ] [ -> ] [ => ]

Autor: Eike Grote Letzte Änderung: 02.10.1997