2010-03-10 7 views
23

J'ai un problème avec la fonction system. Je veux stocker la sortie des fonctions du système dans une variable.Comment puis-je stocker la sortie de la fonction système de Perl dans une variable?

Par exemple,

system("ls"); 

Ici, je veux tous les noms de fichiers dans le répertoire courant pour stocker dans une variable. Je sais que je peux le faire en redirigeant la sortie dans un fichier et lire à partir de cela et le stocker dans une variable. Mais je veux un moyen efficace que cela. Y a-t-il un moyen?

+1

utilisent 'mes sortie $ = qx (ls 2> &1);' la dernière partie est à la fois stdout et stderr –

Répondre

16

Non, vous ne pouvez pas stocker les valeurs de la sortie ls, système depuis toujours exécuter la commande comme un processus enfant, alors essayez avec backtick `commande` qui exécute la commande dans le processus en cours lui-même!

+4

@abubacker -. Exécuter une contre-apostrophes ne –

+5

Les backticks exécutent la commande dans un processus fils et capturent sa sortie Si vous voulez exécuter la commande dans le même processus, vous utilisez 'exec' - mais il ne retournera jamais car le code Perl d'origine n'est plus exécuté retourner le processus à l'autre commande –

+0

Comment procéder pour capturer la sortie d'une commande dans une variable sans la montrer à l'écran? – antred

12

La façon la plus simple des backticks ou qx():

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

La sortie est similaire à la ls.

+1

'echo' i s une commande shell, les équivalents Perl sont appelés 'print' et' say'. – daxim

+0

Cela fonctionne pour ls, mais pas pour la commande find, pour cela je suppose que ses backticks, http://stackoverflow.com/questions/3854651/how-can-i-store-the-result-of-a-system- command-in-a-perl-variable. –

10

Ma réponse ne résout pas votre problème. Toutefois, si vous voulez vraiment faire la liste des répertoires, n'appelez pas le système ls comme ça. Utilisez opendir(), readdir() ou une boucle while.

Par exemple,

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

En fait, si ce n'est pas un programme propriétaire tiers, essayez toujours de fonctions propres de Perl utilisateur.

7

La documentation Perl officiel intégré dans system états de fonction:

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

Il existe de nombreuses façons d'accéder facilement aux documents:

  1. Sur la ligne de commande: perldoc -f system
  2. en ligne à perldoc.perl.org.
  3. Rechercher sur le Web avec google.

Si vous souhaitez que chaque répertoriant stocké dans un élément de tableau séparé, utilisez:

my @entries = qx(ls); 
9

Comme abubacker dit, vous pouvez utiliser des apostrophes inverses pour capturer la sortie d'un programme dans une variable pour une utilisation ultérieure.Toutefois, si vous devez également vérifier les valeurs de retour exceptionnelles, ou by-pass Invoquer le shell, il est temps de mettre dans 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é dans une variété de façons, et permet vous pouvez personnaliser les valeurs de retour d'erreur qui sont "acceptables", si vous souhaitez contourner le shell ou non, et comment gérer le regroupement d'arguments. Il fournit également un remplacement direct pour system() qui ajoute plus de vérification d'erreur.

0

Un moyen rapide et simple de le faire est d'utiliser qx() spécifiquement pour votre exemple:

my $output = qx(ls 2>&1);

La partie 2>&1 est à la fois stdout et stderr.

2

Utilisez les apostrophes inverses pour stocker la sortie dans une variable

$output = `ls`; 
+0

Eh bien, cette information a déjà été donnée dans d'autres réponses. – fancyPants

Questions connexes