# Perl - Dateien und Verzeichnisse

### 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 }
    }

### 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       |                   |

### 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):

- Änderung des Namens: `rename()`

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

            rename("alter_name","neuer_name");

- Löschen einer Datei: `unlink()`

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

            unlink("dateiname");

- Erzeugen eines Verzeichnisses: `mkdir()`

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

            $permissions = 0777;
            mkdir("dirname",$permissions);

- Löschen eines (leeren) Verzeichnisses: `rmdir()`

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

            rmdir("dirname");

- Hard Link erzeugen: `link()`

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

            link("filename","linkname");

- Soft Link erzeugen: `symlink()`

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

            symlink("filename","linkname");

- Ändern der Zugriffsrechte: `chmod()`

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

            $permissions = 0755;
            chmod($permissions,"prog_1","prog_2","prog_3");

- Ändern des Besitzers: `chown()`

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

            $uid = 4987;                      # Benutzer-ID
            $gid = 33;                        # Gruppen-ID
            chown($uid,$gid,"datei");

- Ändern der Zeitdaten: `utime()`

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

            $access = 812_000_000;            # letzter Zugriff
            $modif =  822_000_000;            # letzte Aenderung
            utime($access,$modif,"datei");

  Die Zeiten sind hierbei in Sekunden seit dem 1.1.1970 anzugeben. Die aktuelle Systemzeit kann über den Operator `time` abgefragt werden:

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

            print "Seit dem 1.1.1970 sind ";
            print time;
            print " Sekunden vergangen.\n";

Autor: Eike Grote | Letzte Änderung: 03.11.2004