web-dev-qa-db-fra.com

Comment puis-je stocker la sortie de la fonction système de Perl dans une variable?

J'ai un problème avec system function. Je veux stocker la sortie des fonctions système dans une variable.

Par exemple,

system("ls");

Ici, je veux que tous les noms de fichiers du répertoire courant soient stockés dans une variable. Je sais que je peux le faire en redirigeant la sortie dans un fichier, en le lisant et en le stockant dans une variable. Mais je veux un moyen efficace que cela. Y a-t-il un moyen?.

24
karthi_ms

Non, vous ne pouvez pas stocker les valeurs de la sortie ls, Le système exécutant toujours la commande sous forme de processus enfant,

18
abubacker

Le moyen le plus simple consiste à utiliser des backticks ou qx():

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

La sortie est similaire à la ls.

14
user289664

Ma réponse ne répond pas à votre problème. Cependant, si vous voulez VRAIMENT faire une liste de répertoires, n'appelez pas system ls comme ça. Utilisez opendir () , readdir () ou une boucle while.

Par exemple, 

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

En fait, s'il ne s'agit pas d'un programme propriétaire tiers, essayez toujours d'utiliser les fonctions propres à Perl.

10
ghostdog74

Comme l'a déclaré Abubacker, vous pouvez utiliser des backticks pour capturer la sortie d'un programme dans une variable pour une utilisation ultérieure. Toutefois, si vous devez également rechercher des valeurs de retour exceptionnelles ou contourner l'appel du shell, il est temps d'introduire un module CPAN, IPC :: System :: Simple :

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

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

Ce module peut être appelé de différentes manières et vous permet de personnaliser les valeurs de retour d'erreur "acceptables", de contourner ou non le shell et de gérer le regroupement des arguments. Il fournit également un remplacement instantané pour system() qui ajoute davantage de contrôle d'erreur.

9
Ether

La documentation Perl officielle du système intégré function indique:

Ce n'est pas ce que vous voulez utiliser pour capturer la sortie d'une commande, pour que vous devriez utiliser simplement des backticks ou qx //, comme décrit dans "STRING" dans perlop.

Il existe de nombreuses façons d’accéder facilement à la documentation:

  1. Sur la ligne de commande: perldoc -f system
  2. En ligne à perldoc.Perl.org
  3. Rechercher sur le Web en utilisant Google.

Si vous souhaitez que chaque liste de répertoires soit stockée dans un élément de tableau séparé, utilisez:

my @entries = qx(ls);
7
toolic

Utiliser des pics pour stocker la sortie dans une variable

$output = `ls`;
2
serenesat

Comme il n'a pas encore été mentionné par d'autres réponses, vous pouvez également utiliser Capture :: Tiny pour stocker tout STDOUT (et/ou STDERR) arbitraire dans une variable, y compris à partir de la commande système.

use strict;
use warnings;
use Capture::Tiny 'capture_stdout';
my ($stdout, $return) = capture_stdout { system 'ls' };
# error checking for system return value required here
0
Grinnz