script current actual perl list directory

current - ¿Cómo obtengo una lista de directorios en Perl?



linux echo actual path (9)

Esta pregunta ya tiene una respuesta aquí:

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.