Rekursive Verzeichnis-traversal in Perl
Ich versuche, ein Skript zu schreiben, die druckt die Datei-Struktur, beginnend bei dem Ordner das script liegt in der. Das Skript funktioniert gut, ohne den rekursiven Aufruf aber mit diesem Anruf es druckt den Inhalt des ersten Ordners und stürzt mit folgender Nachricht ab: closedir() versucht auf ungültige dirhandle von DIR an printFiles.pl Linie 24. Die Mappen werden gedruckt und der Ausführung erreicht die Letzte Zeile, aber warum nicht auch der rekursive Aufruf durchgeführt? Und wie soll ich das lösen dieser statt?
#!/usr/bin/perl -w
printDir(".");
sub printDir{
opendir(DIR, $_[0]);
local(@files);
local(@dirs);
(@files) = readdir(DIR);
foreach $file (@files) {
if (-f $file) {
print $file . "\n";
}
if (-d $file && $file ne "." && $file ne "..") {
push(@dirs, $file);
}
}
foreach $dir (@dirs) {
print "\n";
print $dir . "\n";
printDir($dir);
}
closedir(DIR);
}
- Wie wäre
ls -R
? - Ich weiß, aber es ist nicht lustig, es zu tun den einfachen Weg.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie immer
use strict;
unduse warnings;
am Anfang Ihrer Perl-Programm, vor allem, bevor Sie um Hilfe bitten, mit ihm. So wird Perl zeigen, bis eine Menge einfache Fehler, die Sie möglicherweise nicht bemerken, sonst.Den ungültig filehandle Fehler ist wahrscheinlich, weil
DIR
ist ein globales Verzeichnis-handle und geschlossen wurde, die bereits durch eine Vorherige Ausführung des Unterprogramms. Am besten ist es, immer verwendet lexikalische handles für Dateien und Verzeichnisse, und zu testen, den Rückgabewert, um sicherzustellen, dass das öffnen erfolgreich war, wie diesVorteil der lexikalischen Datei-handles ist, dass Sie geschlossen sind implizit, wenn Sie außerhalb des Bereichs, so gibt es keine Notwendigkeit für Ihre
closedir
rufen Ende des Unterprogramms.local
soll nicht verwendet werden, wie, dass. Es reicht nicht als Erklärung, und Sie erstellen eine temporäre Kopie einer globalen variable, die alles zugreifen kann. Am besten verwenden Siemy
statt, wie diesAuch, die Dateinamen, die Sie mithilfe von
readdir
haben kein Pfad, und so Ihre Datei-tests wird scheitern, wenn Sie entwederchdir
zu dem Verzeichnis, das verarbeitet wird, oder fügen Sie den Verzeichnis-Pfad Zeichenfolge der name der Datei, bevor es zu testen.Verwenden Sie die File::Find Modul. Die Art, wie ich normalerweise mit dem find2perl tool, das mit perl kommt, nimmt die gleichen Parameter wie finden und schafft einen passenden perl-Skript mit File::Find. Dann habe ich die Feineinstellung des generierten Skripts zu tun, was ich will, es zu tun. Aber es ist auch möglich, mit File::Find direkt.
Warum nicht
use File::Find
?