2012-06-05 6 views
8

Quiero conseguir la salida de un comando en una matriz — así:lectura de salida del comando en Perl gama

my @output = `$cmd`; 

pero parece que la salida del comando no entra en la matriz @output.

¿Alguna idea de dónde va?

+5

¿Estás seguro de que tu comando escribe en STDOUT? Si escribe en STDERR, los trazos inversos no capturarán esto sin agregar '2> & 1' a su llamada. – dgw

+3

¿Cómo determina que la salida no entre en la matriz? –

Respuesta

2

Habilitación de comprobaciones automáticas de error:

require IPC::System::Simple; 
use autodie qw(:all); 
⋮ 
my @output = `$cmd`; 
6

La salida (estándar) no vaya a esa matriz:

[email protected]:listing # cat > demo.pl 
#!/usr/bin/perl 
use strict; 
use warnings; 
use v5.14; 
use Data::Dump qw/ddx/; 

my @output = `ls -lh`; 
ddx \@output; 
[email protected]:listing # touch a b c d 
[email protected]:listing # perl demo.pl 
# demo.pl:8: [ 
# "total 8\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 a\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 b\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 c\n", 
# "-rw-r--r-- 1 david staff  0B 5 Jun 12:15 d\n", 
# "-rw-r--r-- 1 david staff 115B 5 Jun 12:15 demo.pl\n", 
# ] 
10

Este sencillo script funciona para mí:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my $cmd = "ls";  
my @output = `$cmd`;  
chomp @output; 

foreach my $line (@output) 
{ 
    print "<<$line>>\n"; 
} 

Produjo la salida (excepto los puntos triples):

$ perl xx.pl 
<<args>> 
<<args.c>> 
<<args.dSYM>> 
<<atob.c>> 
<<bp.pl>> 
... 
<<schwartz.pl>> 
<<timer.c>> 
<<timer.h>> 
<<utf8reader.c>> 
<<xx.pl>> 
$ 

La salida del comando se divide en los límites de la línea (por defecto, en el contexto de la lista). El chomp elimina las nuevas líneas en los elementos de la matriz.

+0

la salida no es un error no sé lo que realmente es –

+1

Entonces es posible que necesite identificar su comando para nosotros con más claridad. Mostré la tarea a '$ cmd'; no has mostrado lo que está en el comando que estás ejecutando. ¿Has intentado usar 'ls' o' pwd' o 'echo Hello World' como el comando para ver si obtienes algo útil? Tampoco has mostrado cómo estás procesando la matriz. –

Cuestiones relacionadas