2010-03-10 18 views
23

Tengo un problema con la función system. Quiero almacenar las salidas de las funciones del sistema en una variable.¿Cómo puedo almacenar la salida de la función de sistema de Perl en una variable?

Por ejemplo,

system("ls"); 

aquí quiero todos los nombres de los archivos en el directorio actual para almacenar en una variable. Sé que puedo hacerlo redireccionando la salida a un archivo y leyendo de eso y almacenando eso en una variable. Pero quiero una manera eficiente que eso. Hay alguna manera .

+1

'mis $ salida = qx (ls 2> &1);' La última parte es para capturar stdout y stderr –

Respuesta

16

No, no es posible almacenar los valores de la salida de ls, ya que el sistema siempre ejecutar el comando como un proceso hijo, a fin de tratar con tilde `command` que ejecuta el comando en el actual proceso de sí mismo!

+4

@abubacker -. Invertidas hace ejecutar una proceso hijo –

+5

Backticks ejecuta el comando en un proceso hijo y captura su salida. Si desea ejecutar el comando en el mismo proceso, usa 'exec' - pero nunca volverá porque el código Perl original ya no se ejecuta después volviendo el proceso al otro comando. –

+0

¿Cómo se podría capturar la salida de un comando en una variable sin mostrarlo en la pantalla? – antred

12

La forma más sencilla utiliza acentos abiertos o qx():

my $value = qx(ls); 
print $value; 

La salida es similar a la ls.

+1

'echo' i s un comando de shell, los equivalentes Perl se llaman 'print' y' say'. – daxim

+0

Eso funciona para ls, pero no para el comando find, para eso supongo que es un backticks, http://stackoverflow.com/questions/3854651/how-can-i-store-the-result-of-a-system- command-in-a-perl-variable. –

10

Mi respuesta no resuelve su problema. Sin embargo, si REALMENTE desea hacer una lista de directorios, no llame al sistema ls de esa manera. Use opendir(), readdir(), o un while loop.

Por ejemplo,

while (<*>){ 
    print $_ ."\n"; 
} 

De hecho, si no es un programa propietario de terceros, siempre trate de funciones propias del usuario de Perl.

7

La documentación oficial de Perl para el incorporado en system estados de función:

Esto no es lo que se desea utilizar para captura la salida de un comando, por que se debe utilizar solamente acentos abiertos o qx //, como se describe en "STRING" en perlop.

Hay numerosas maneras de acceder fácilmente a los documentos:

  1. En la línea de comandos: perldoc -f system
  2. línea en perldoc.perl.org.
  3. Busque en la web usando google.

Si desea que cada listado del directorio almacenado en un elemento de la matriz por separado, utilice:

my @entries = qx(ls); 
9

Como se ha indicado abubacker, puede utilizar acentos abiertos para capturar la salida de un programa en una variable para su uso posterior.Sin embargo, si también es necesario comprobar si los valores de retorno excepcionales, o de derivación que invocan la concha, es el momento de traer a un módulo de CPAN, IPC::System::Simple:

use IPC::System::Simple qw(capture); 

# Capture output into $result and throw exception on failure 
my $result = capture("some_command"); 

Este módulo puede ser llamado en una variedad de maneras, y permite usted puede personalizar qué valores de retorno de error son "aceptables", si omitir el shell o no, y cómo manejar la agrupación de argumentos. También proporciona un reemplazo directo para system() que agrega más comprobación de errores.

0

Una forma rápida y sencilla de hacer esto es utilizar qx() específicamente para su ejemplo:

my $output = qx(ls 2>&1);

El 2>&1 parte es capturar stdout y stderr.

2

Use acentos abiertos se almacenan los resultados en una variable de uso

$output = `ls`; 
+0

Bueno, esta información ya fue dada en otras respuestas. – fancyPants

Cuestiones relacionadas