Comment puis-je stocker le résultat d'une commande système dans une variable Perl?

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

je veux capturer le résultat i.e. 11 dans une variable. Comment puis-je le faire?

18
demandé sur Nikhil Jain 2010-10-04 15:06:23

4 réponses

Perlfaq8:

Vous êtes confus le but de system () et backticks (`). system () exécute une commande et renvoie les informations d'état de sortie (en valeur de 16 bits: les 7 bits les plus bas sont le signal dont le processus est mort, s'il y en a, et les 8 bits les plus hauts sont la valeur de sortie réelle). Backticks ( ` ) exécute une commande et renvoie ce qu'elle a envoyé à STDOUT.

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

Il y a plusieurs façons d'exécuter des commandes externes à partir de Perl. La plupart des communes avec leurs significations sont les suivantes:

  • system () : vous souhaitez exécuter une commande et ne veulent pas capturer sa sortie
  • exec: vous ne voulez pas rentrer à la appel du script perl
  • backticks : vous voulez capturer l' la sortie de la commande
  • ouvrir: vous voulez tuyau de la commande (en tant que d'entrée ou de de sortie) de votre script

voir Aussi Comment puis-je capturer STDERR à partir d'une commande externe?

44
répondu Nikhil Jain 2010-10-05 04:31:17

Le plus simple est d'utiliser le `` fonctionnalité en Perl. Ceci exécutera ce qui est à l'intérieur et retournera ce qui a été imprimé à stdout:

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

Cela devrait le faire.

9
répondu Peter Tillemans 2014-09-30 14:29:04

Essayez d'utiliser qx{command} plutôt que des bâtons. Pour moi, c'est un peu mieux parce que: vous pouvez faire SQL avec elle et ne pas vous soucier d'échapper des citations et autres. Selon l'éditeur et l'écran, mes vieux yeux ont tendance à manquer les petites tiques arrière, et il ne devrait pas avoir de problème à être surchargé comme l'utilisation de crochets d'angle contre glob.

7
répondu Ken Hylton 2014-09-30 14:29:52

en utilisant backtick ou qx aide, merci à tous pour les réponses. Cependant, j'ai trouvé que si vous utilisez backtick ou qx, la sortie contient newline et je dois supprimer cela. J'ai donc utilisé chomp.

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

plus d'information ici: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html

2
répondu Soumya Kanti 2016-02-16 08:32:05