32 votes

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 = $not\n";
$ perl test.pl
11
not = 0
$

Je veux capturer le résultat, c'est-à-dire 11 dans une variable. Comment puis-je faire cela ?

72voto

Nikhil Jain Points 5687

De [Perlfaq8](http://perldoc.perl.org/perlfaq8.html#Why-can't-I-get-the-output-of-a-command-with-system()%3f) :

Vous confondez le but de système() y backticks (``). system() exécute une commande et retourne des informations sur l'état de sortie (sous la forme d'une valeur de 16 bits : les 7 bits de poids faible sont le signal de mort du processus, s'il y en a un, et les 8 bits de poids fort sont la valeur de sortie réelle). Backticks (``) exécute une commande et retourne ce qu'elle a envoyé à STDOUT.

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

Il existe de nombreuses façons d'exécuter des commandes externes à partir de Perl. Les plus courantes, avec leur signification, sont les suivantes :

  • système() : vous voulez exécuter une commande et ne voulez pas capturer sa sortie
  • exec : vous ne voulez pas revenir à la version appelant perl script
  • backticks : vous voulez capturer la sortie de la commande
  • ouvrir : vous souhaitez acheminer la commande (comme entrée ou sortie) vers votre script.

Voir aussi Comment puis-je capturer STDERR à partir d'une commande externe ?

16voto

Peter Tillemans Points 20129

Le moyen le plus simple est d'utiliser le `` en Perl. Ceci exécutera ce qui se trouve à l'intérieur et retournera ce qui a été imprimé sur la sortie standard :

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

Cela devrait le faire.

11voto

Ken Hylton Points 91

Essayez d'utiliser qx{command} plutôt que des backticks. Pour moi, c'est un peu mieux parce que : vous pouvez faire du SQL avec et ne pas vous soucier de l'échappement des guillemets et autres. Selon l'éditeur et l'écran, mes vieux yeux ont tendance à ne pas voir les minuscules points arrière, et il ne devrait jamais y avoir de problème de surcharge, comme l'utilisation de crochets d'angle par rapport au glob.

4voto

Soumya Kanti Points 33

Utilisation de backtick o qx aide, merci à tous pour les réponses. Cependant, j'ai découvert que si vous utilisez backtick o qx La sortie contient une nouvelle ligne de queue et je dois la supprimer. J'ai donc utilisé chomp .

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

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

1voto

Crazy coder Points 99

Utilisez des backticks pour les commandes système, ce qui permet de stocker leurs résultats dans des variables Perl.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X