2008-10-15 18 views

Respuesta

61

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... 
+2

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

+0

Sí, tienes razón, lo agregaré. Gracias. –

+0

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

6

Para obtener la salida de un comando del sistema, necesita utilizar los apoyos.

$listing = `ls`; 

Sin embargo, Perl es bueno en el manejo de directorios por sí mismo. Yo recomendaría usar File :: Find :: Rule.

0

le recomiendo que eche un vistazo a IPC::Open3. Permite mucho más control sobre el proceso engendrado que el sistema o los backticks.

12

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

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

+0

Específicamente, glob hace exactamente lo que desea: devuelve una matriz de los nombres de los archivos en una carpeta. –

0

En Linux, prefiero encontrar:

my @files = map { chomp; $_ } `find`; 
+0

esto es particularmente útil si no solo está enumerando el directorio, sino que quiere encontrar archivos con algunos criterios. Como decir que quieres archivos modificados en los últimos 2 días: my @recentFiles = map {chomp; $ _} 'find $ theDir -maxdepth 1 -type f -mtime -2'; –

5

Otro ejemplo más:

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

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); 
+1

+1 como Archivo :: Buscar :: La regla es rockera –

6

Uso Perl Globbing:

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