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?.
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,
Le moyen le plus simple consiste à utiliser des backticks ou qx()
:
my $value = qx(ls);
print $value;
La sortie est similaire à la ls
.
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.
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.
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:
perldoc -f
system
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);
Utiliser des pics pour stocker la sortie dans une variable
$output = `ls`;
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