Wie lese ich mehrere Verzeichnisse und Lesen Sie den Inhalt von Unterverzeichnissen in Perl?
Ich habe ein Ordner, und in dieser habe ich viele Unterordner. In diesen Unterordnern habe ich viele .html-Dateien gelesen werden. Ich habe geschrieben, die folgenden code zu tun. Es öffnet den übergeordneten Ordner und auch den ersten Unterordner, und es gibt nur eine .html-Datei. Es zeigt Fehler:
NO SUCH FILE OR DIRECTORY
Ich möchte nicht den gesamten code. Änderungen in den bestehenden code wird für mich gut sein.
use FileHandle;
opendir PAR_DIR,"D:\\PERL\\perl_programes\\parent_directory";
while (our $sub_folders = readdir(PAR_DIR))
{
next if(-d $sub_folders);
opendir SUB_DIR,"D:\\PERL\\perl_programes\\parent_directory\\$sub_folders";
while(our $file = readdir(SUB_DIR))
{
next if($file !~ m/\.html/i);
print_file_names($file);
}
close(FUNC_MODEL1);
}
close(FUNC_MODEL);
sub print_file_names()
{
my $fh1 = FileHandle->new("D:\\PERL\\perl_programes\\parent_directory\\$file")
or die "ERROR: $!"; #ERROR HERE
print("$file\n");
}
- Tipp: lieber mit "meiner" zu "unserer", und führen Sie perl mit der option-w (und "use strict" wenn überhaupt möglich). geholfen hätte zeigen sich diese Fehler früher: mit "meine", aber ohne strenge, es hätte davor gewarnt, dass du "$file" wurde nicht definiert, und mit strenge, es wäre gestorben vor der Ausführung sagt, dass "$file" war nicht deklarierte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist nicht extrahieren Sie die mitgelieferte
$file
parameter in derprint_file_names()
Funktion.Sollte es sein:
Ihre
-d
test in der äußeren Schleife falsch aussieht auch, BTW. Du sagstnext if -d ...
was bedeutet, dass Sie überspringen Sie die innere Schleife für die Verzeichnisse, die, wie es scheint das komplette Gegenteil von dem, was Sie benötigen. Der einzige Grund, warum es überhaupt funktioniert, ist, weil Sie testen wollen$file
was nur der Dateiname relativ zu dem Pfad, und nicht der volle Pfad-name.Beachten Sie auch:
/
als Pfad-separatoropendir($scalar, $path)
stattopendir(DIR, $path)
Achtung: ungetestet-code folgt:
Ihre geposteten code sieht viel zu kompliziert. Check-out File::Find::Rule und Sie könnte das tun die meisten, dass schweres heben in sehr wenig code.
Ich meine ist das nicht sexy?!
Einem Benutzer kommentiert, dass Sie vielleicht wollen verwenden Sie nur Tiefe=2 Einträge.
Gilt diese Einschränkung.
Bitte anfangen:
oben alle Ihre Skripte, wird es Ihnen helfen, Probleme zu vermeiden, wie dies und machen den code sehr viel besser lesbar.
Lesen Sie mehr über es hier: Perlmonks
Sind Sie gehen zu müssen, ändern Sie den gesamten code, um es robust:
Haben Sie sich überlegt mit
File::Find
Hier ist eine Methode, die nicht erforderlich ist, mit File::Find:
Öffnen Sie zunächst das root-Verzeichnis, und speichern Sie alle sub-Ordner-Namen in einem array mit readdir;
Verwenden Sie anschließend eine foreach-Schleife. Für jeden sub-Ordner, öffnen Sie das neue Verzeichnis durch die Verknüpfung des root-Verzeichnis und einen Namen für den Ordner. Immer noch verwenden, readdir, die zum speichern der Dateinamen in einem array.
Der Letzte Schritt ist das schreiben des codes für die Bearbeitung der Dateien innerhalb dieser foreach-Schleife.
Besonderen Dank an meine Lehrerin, die hat mir diese Idee 🙂 Es wirklich gut funktioniert!