Pregunta

    

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 exec .

¿Hay una mejor manera de obtener una lista de un directorio en Perl?

¿Fue útil?

Solución

Exec no regresa en absoluto. Si querías eso, usa el sistema.

Si solo desea 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...

Otros consejos

Todos los demás parecen atascados en la parte ejecutiva de la pregunta.

Si desea una lista de directorios, use el glob o opendir integrado de Perl. No necesitas un proceso separado.

exec no le devuelve el control al programa perl. sistema lo hará, pero no devuelve los resultados de una 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.

Utilice las funciones de dir integradas. opendir, readdir, etc.

http://perldoc.perl.org/functions/opendir.html

http://perldoc.perl.org/functions/readdir.html

Para obtener la salida de un comando del sistema, necesitas usar backticks.

$listing = `ls`;

Sin embargo, Perl es bueno para manejar directorios por sí mismo. Recomiendo usar File :: Find :: Rule.

Utilizar Perl Globbing:

my $dir = </dir/path/*> 

Otro ejemplo más:

chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");

EDITAR: ¡Vaya! Pensé que solo quería una lista de los directorios ... elimine la llamada al 'directorio' para que este script haga lo que usted quiere ...

En mi opinión, jugar con manejadores de archivos es la forma incorrecta de hacerlo. El siguiente es un ejemplo del uso de File :: Find :: Rule para encontrar todos los directorios en un directorio específico. Puede parecer que está sobre matando por lo que estás haciendo, pero más adelante, puede que valga la pena.

Primero, mi solución de una línea:

File::Find::Rule->maxdepth(1)->directory->in($base_dir);

Ahora una versión más dibujada con comentarios. Si tiene instalado File :: Find :: Rule, debería poder ejecutar esto 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);

Le recomendaría que eche un vistazo a IPC :: Open3 . Permite mucho más control sobre el proceso generado que el sistema o los backticks.

En Linux, prefiero encontrar:

my @files = map { chomp; 

En Linux, prefiero encontrar:

<*> } `find`;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top