EDIT: ¡Vaya! Pensé que solo quería una lista de los directorios ... eliminar la llamada de 'directorio' para hacer que esta secuencia de comandos haga lo que quiera ...
Jugar con manejadores de archivos es una forma incorrecta de hacerlo, en mi opinión. El siguiente es un ejemplo del uso de File :: Find :: Rule para encontrar todos los directorios en un directorio específico. Puede parecer una muerte excesiva por lo que estás haciendo, pero más adelante puede valer la pena.
En primer lugar, mi solución una línea:
File::Find::Rule->maxdepth(1)->directory->in($base_dir);
ahora una versión más elaborado con comentarios. Si tiene instalado File :: Find :: Rule, debería poder ejecutarlo sin problemas. No temas al 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);
Comprobar el valor de retorno de comandos de sistema: opendir ... o morir "... $!" O "use autodie;" para hacerlos fatales por defecto. Sé que es solo un pequeño detalle, pero cuando le das consejos a los principiantes es una lección importante para ellos. – tsee
Sí, tienes razón, lo agregaré. Gracias. –
En caso de que alguien se pregunte por qué readdir y closedir no están marcados: ambos solo tienen un posible error, 'identificador de directorio no válido'. Desde que lo abrí y lo revisé, puedo suponer con seguridad que es válido. Además, en el contexto de la lista readddir no se puede marcar de todos modos. –