EDIT: Whoops! Je pensais que vous vouliez juste une liste des répertoires ... supprimer l'appel 'répertoire' pour faire de ce script ce que vous voulez ...
Jouer avec des handles de fichiers est la mauvaise façon d'y aller à mon avis. Voici un exemple d'utilisation de File :: Find :: Rule pour trouver tous les répertoires dans un répertoire spécifié. Cela peut sembler plus que tuer pour ce que vous faites, mais plus tard, ça peut valoir le coup.
D'abord, ma solution d'une ligne:
File::Find::Rule->maxdepth(1)->directory->in($base_dir);
maintenant une version plus tirée des commentaires. Si vous avez installé File :: Find :: Rule, vous devriez être capable de l'exécuter sans problème. Ne craignez pas le CPAN.
#!/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);
Vérifiez la valeur de retour des commandes système: opendir ... ou mourir "... $!" Ou "utiliser autodie;" pour les rendre fatales par défaut. Je sais que c'est juste un pic, mais quand vous donnez des conseils aux débutants, c'est une leçon importante pour eux. – tsee
Oui, vous avez raison, je vais l'ajouter. Merci. –
Dans le cas où quelqu'un se demande pourquoi readdir et closedir ne sont pas cochés: les deux n'ont qu'une seule erreur possible, 'handle de répertoire invalide'. Depuis que je l'ai ouvert moi-même et vérifié, je peux supposer que c'est valide. De plus, dans le contexte de la liste, readddir ne peut pas être vérifié de toute façon. –