EDIT: Whoops! Ich dachte, Sie wollten nur eine Liste der Verzeichnisse ... entfernen Sie den 'Verzeichnis' Anruf, um dieses Skript zu machen, was Sie wollen ...
Spielen mit Dateihandles ist meiner Meinung nach der falsche Weg. Im Folgenden finden Sie ein Beispiel für die Verwendung von File :: Find :: Rule, um alle Verzeichnisse in einem angegebenen Verzeichnis zu finden. Es scheint, als ob Sie für das, was Sie tun, über töten, aber später auf der ganzen Linie kann es sich lohnen.
Zuerst meine eine Zeile Lösung:
File::Find::Rule->maxdepth(1)->directory->in($base_dir);
Jetzt eine herausgezogen Version mit Kommentaren. Wenn Sie File :: Find :: Rule installiert haben, sollten Sie dies problemlos ausführen können. Fürchte die CPAN nicht.
#!/usr/bin/perl
use strict;
use warnings;
# See http://search.cpan.org/~rclamp/File-Find-Rule-0.32/README
use File::Find::Rule;
# If a base directory was not past to the script, assume current working director
my $base_dir = shift // '.';
my $find_rule = File::Find::Rule->new;
# Do not descend past the first level
$find_rule->maxdepth(1);
# Only return directories
$find_rule->directory;
# Apply the rule and retrieve the subdirectories
my @sub_dirs = $find_rule->in($base_dir);
# Print out the name of each directory on its own line
print join("\n", @sub_dirs);
Überprüfen Sie den Rückgabewert der Systembefehle: opendir ... oder sterben "... $!" Oder "Autodie verwenden"; um sie standardmäßig fatal zu machen. Ich weiß, es ist nur ein Nitpick, aber wenn Sie Anfänger beraten, ist es eine wichtige Lektion für sie. – tsee
Ja, du hast Recht, ich werde es hinzufügen. Vielen Dank. –
Falls sich jemand fragt, warum readdir und closedir nicht aktiviert sind: beide haben nur einen möglichen Fehler: 'invalid directory handle'. Da ich es selbst geöffnet und überprüft habe, kann ich davon ausgehen, dass es gültig ist. Auch im Listenkontext kann readddir nicht überprüft werden. –