¿Cómo puedo almacenar el resultado de un comando del sistema en una variable de Perl?

$ cat test.pl my $pid = 5892; my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l"); print "not = $not\n"; $ perl test.pl 11 not = 0 $ 

Quiero capturar el resultado, es decir, 11 en una variable. ¿Cómo puedo hacer eso?

De Perlfaq8 :

Estás confundiendo el propósito de system () y backticks (“). system () ejecuta un comando y devuelve información de estado de salida (como un valor de 16 bits: los 7 bits bajos son la señal de la que murió el proceso, si existe, y los 8 bits altos son el valor de salida real). Backticks (“) ejecuta un comando y devuelve lo que envió a STDOUT.

 $exit_status = system("mail-users"); $output_string = `ls`; 

Hay muchas formas de ejecutar comandos externos desde Perl. Los más comunes con sus significados son:

  • sistema () : desea ejecutar un comando y no desea capturar su salida
  • ejecutivo : no desea volver a la secuencia de comandos llamada perl
  • backticks : desea capturar la salida del comando
  • abrir : desea canalizar el comando (como entrada o salida) a su secuencia de comandos

También vea ¿Cómo puedo capturar STDERR desde un comando externo?

La forma más fácil es usar la función `` en Perl. Esto ejecutará lo que está dentro y devolverá lo que se imprimió a stdout:

  my $pid = 5892; my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`; print "not = $var\n"; 

Esto debería hacerlo.

Intenta usar qx{command} lugar de backticks. Para mí, es un poco mejor porque: puedes hacer SQL con él y no preocuparte por escapar de las comillas y demás. Dependiendo del editor y la pantalla, mis viejos ojos tienden a pasar por alto los pequeños tics de la espalda, y nunca debería haber un problema con la sobrecarga, como usar corchetes angulares versus glob.

Usar backtick o qx ayuda, gracias a todos por las respuestas. Sin embargo, descubrí que si usa backtick o qx , la salida contiene una nueva línea y necesito eliminarla. Entonces usé chomp .

 chomp($host = `hostname`); chomp($domain = `domainname`); $fqdn = $host.".".$domain; 

Más información aquí: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html