2017-10-04 29 views
2
  • J'intègre un cadre de journalisation à mon projet perl qui a environ 300 fichiers Perl.
  • J'ai donc écrit un module Logging.pm qui a die substituée, say, warn fonctionnalités et depuis print ne peut pas être surchargée j'ai attacha ma poignée personnalisée.
  • J'ai un script principal execute.pl qui exécute tous les scripts via system/qx/exec.
  • Je veux inclure Logging.pm en seulement execute.pl et toutes les fonctionnalités de Logging.pm devraient être availabe dans le processus enfant exécuté par execute.pl par system() ou qx() ou exec().

Exemple d'exécution:Modules hérités par le processus fils du processus parent en Perl

execute.pl -> system("test1.pl") -> system("test2.pl") 

Ainsi, le test1.pl et test2.pl devrait prendre la die/warn/say/print surchargée si je ajoutez seulement Logging.pm à excute.pl. Pour autant que je sache, system/qx/exec sera OS appel et Logging.pm ne sera pas disponible dans le processus de l'enfant, est-il possible de le faire car je ne veux pas modifier 300 fichiers?

Répondre

2

Étant donné que les sous-processus sont des processus entièrement séparés, ils ne conservent aucun module chargé par le processus parent.

Une possibilité pour résoudre ceci est de définir la variable d'environnement PERL5OPT. Cette variable peut contenir des indicateurs de ligne de commande supplémentaires pour l'interpréteur Perl. Cependant, cela affectera tous les processus Perl démarrés directement ou indirectement par votre script, et pas seulement ceux qui font partie de votre projet.

Pour automatiquement use Logging, vous devez ajouter -MLogging au PERL5OPT. En shell:

$ export PERL5OPT="$PERL5OPT -MLogging" 
$ ./execute.pl 

ou

$ PERL5OPT="$PERL5OPT -MLogging" ./execute.pl 

ou dans execute.pl:

$ENV{PERL5OPT} .= " -MLogging";