Vous trouverez l'emplacement de votre interpréteur perl actuel dans la variable spéciale $^X
. Ceci est important si perl n'est pas dans votre chemin, ou si vous avez plusieurs versions de Perl disponibles, mais pour vous assurer que vous utilisez le même dans tous les domaines. Lors de l'exécution de commandes externes, y compris d'autres programmes Perl, la détermination de leur exécution peut être assez difficile. Inspectant $?
peut laisser des cicatrices mentales durables, donc je préfère utiliser IPC::System::Simple (disponible à partir du CPAN):
use strict;
use warnings;
use IPC::System::Simple qw(system capture);
# Run a command, wait until it finishes, and make sure it works.
# Output from this program goes directly to STDOUT, and it can take input
# from your STDIN if required.
system($^X, "yourscript.pl", @ARGS);
# Run a command, wait until it finishes, and make sure it works.
# The output of this command is captured into $results.
my $results = capture($^X, "yourscript.pl", @ARGS);
Dans les deux exemples ci-dessus tous les arguments que vous souhaitez passer à votre programme externe vont dans @ARGS
. Le shell est également évité dans les deux exemples ci-dessus, ce qui vous donne un petit avantage de vitesse, et évite toute interaction indésirable impliquant des méta-caractères shell. Le code ci-dessus s'attend également à ce que votre deuxième programme renvoie une valeur de sortie nulle pour indiquer le succès; si ce n'est pas le cas, vous pouvez spécifier un premier argument supplémentaire des valeurs de sortie admissibles:
# Both of these commands allow an exit value of 0, 1 or 2 to be considered
# a successful execution of the command.
system([0,1,2], $^X, "yourscript.pl", @ARGS);
# OR
capture([0,1,2, $^X, "yourscript.pl", @ARGS);
Si vous avez un processus de longue durée et que vous voulez traiter ses données en il est généré, alors vous Vous aurez probablement besoin d'un tuyau ouvert ou d'un des modules IPC les plus lourds du CPAN. Cela dit, chaque fois que vous avez besoin d'appeler un autre programme Perl de Perl, vous pouvez envisager d'utiliser un module comme meilleur choix. Le démarrage d'un autre programme comporte de nombreux frais généraux, à la fois en termes de coûts de démarrage et de coûts d'E/S pour le transfert de données entre les processus. Cela augmente également considérablement la difficulté de traitement des erreurs. Si vous pouvez transformer votre programme externe en module, vous trouverez peut-être qu'il simplifie votre conception globale.
Tous les meilleurs,
Paul
Ne serait-il pas beaucoup plus facile et plus concis d'utiliser simplement 'faire'? – innaM
Merci. J'ai ajouté "faire" à la liste. – Colin