Mittwoch, 25. November 2009

Dateien aus Verzeichnis auslesen in Perl

Dateien und Verzeichnisse lassen sich mit Perl schnell und effizient bearbeiten. Wenn man einfach alle Verzeichnisse und Dateien aus einem Verzeichnis in ein Array einlesen will, dann reicht folgender Code:

opendir(DIR, "irgendeinverzeichnis");
@files = readdir(DIR);
closedir(DIR);

Vorsicht: das Array enthält die Verzeichnisse "." und "..", ganz am Anfang. Um diese loszuwerden:

shift @files; shift @files;

Man kann auch gleich das Einlesen per regulärem Ausdruck auf bestimmte Dateien beschränken, für .wav-Dateien sieht das z.B. so aus:

opendir(DIR, $dir);
@files = grep { /\.wav$/ } readdir(DIR);
closedir(DIR);

3 Kommentare:

ReneeB hat gesagt…

Man sollte bei opendir und den anderen Funktionen noch auf Fehler überprüfen (oder das Pragma "autodie" benutzen).

opendir(DIR,'verzeichnis') or die $!;

Der Code holt übrigens nicht nur Dateien aus dem Verzeichnis, sondern auch Unterverzeichnisse.

Zusätzlich sollten lexikalische Filehandles verwendet werden, weil die "Bareword" Filehandles Probleme bereiten können: http://reneeb-perlblog.blogspot.com/2009/09/verschiedenes-zu-open.html

Man kann auch nicht 100%ig sicher sein, dass '.' und '..' am Anfang des Verzeichnislistings kommen. Perl benutzt da die system-eigene Funktionen. Und da nicht spezifiziert ist, dass die beiden Werte am Anfang kommen müssen, kann es Probleme geben. Bei 99% aller Systemen wird das mit dem shift funktionieren.

Ich würde da ein grep benutzen:

my @entries = grep{ !/^\.\.?$/ }readdir( $dirhandle );

Anonym hat gesagt…

Wäre es auch möglich, aus einem Verzeichnis mit z. Bsp. 100 Dateien, diese gesplittet in jeweils 20 Einträge auszulesen?

foreach(@Eintraege) {

- Datei 1 bis 20
- Datei 21 bis 40
- Datei 41 bis 60
- Datei 61 bis 80
- Datei 81 bis 100

...
}

peterbouda hat gesagt…

Dazu würde ich eine zweite Schleife machen:

while((scalar @files) > 0) {
for(my $i=0; $i<20; $i++) {
if ($file = shift(@files)) {
# irgendwas mit der Datei machen
print "$file\n";
}
}
}

Kommentar veröffentlichen