current - ¿Cómo obtengo una lista de directorios en Perl?
linux echo actual path (9)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo leo en el contenido de un directorio en Perl? 8 respuestas
Me gustaría ejecutar ls
en un programa Perl como parte de un script CGI. Para esto usé exec(ls)
, pero esto no regresa de la llamada del exec
.
¿Hay una mejor manera de obtener una lista de un directorio en Perl?
EDITAR: ¡Ups! Pensé que solo quería una lista de los directorios ... eliminar la llamada ''directorio'' para hacer que este script haga lo que usted quiere ...
Jugar con manejadores de archivos es el camino equivocado 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.
Primero, mi solución de una sola línea:
File::Find::Rule->maxdepth(1)->directory->in($base_dir);
Ahora una versión más elaborada 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);
En Linux, prefiero encontrar:
my @files = map { chomp; $_ } `find`;
Exec no regresa en absoluto. Si quieres eso, usa el sistema.
Si solo quiere leer un directorio, abrir / leer / cerrar-dir puede ser más apropiado.
opendir my($dh), $dirname or die "Couldn''t open dir ''$dirname'': $!";
my @files = readdir $dh;
closedir $dh;
#print files...
Otro ejemplo más:
chdir $dir or die "Cannot chroot to $dir: $!/n";
my @files = glob("*.txt");
Para obtener la salida de un comando del sistema, necesita usar los trazos inversos.
$listing = `ls`;
Sin embargo, Perl es bueno en el manejo de directorios por sí mismo. Yo recomendaría usar File :: Find :: Rule.
Todos los demás parecen estancados en la parte del ejecutivo de la pregunta.
Si desea una lista de directorios, use el glob
integrado de Perl o opendir
. No necesitas un proceso separado.
Use Perl Globbing:
my $dir = </dir/path/*>
Yo recomendaría que eche un vistazo a IPC::Open3 . Permite mucho más control sobre el proceso engendrado que el sistema o los backticks.
El ejecutivo no devuelve el control al programa Perl. sistema lo hará, pero no devuelve los resultados de un ls, devuelve un código de estado. las marcas de verificación `` le darán el resultado de nuestro comando, pero algunos lo consideran inseguro.
Use las funciones dir incorporadas. opendir, readdir, y así sucesivamente.