2017-10-04 105 views
2
  • 我正在将一个日志框架集成到我的perl项目,该项目有大约300个Perl文件的 。
  • 所以我写了一个模块Logging.pm已覆盖diesaywarn功能和自print不能被重写我已经绑我的自定义手柄。
  • 我有一个主脚本execute.pl它通过system/qx/exec执行所有脚本。
  • 我想包括在短短execute.plLogging.pm和所有的Logging.pm的 功能应通过system()qx()exec()通过execute.pl执行的子 过程将支援。执行的

例子:从父进程在Perl中的子进程继承的模块

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

所以test1.pltest2.pl应该拿起重写die/warn/say/print如果我只是包括excute.plLogging.pm

据我所知system/qx/exec将OS调用和Logging.pm将不会在子进程中可用,有没有什么办法可以实现这一点,因为我不想编辑300个文件?

回答

2

由于子流程是完全独立的流程,它们不会保留父流程加载的任何模块。

解决此问题的一种可能性是设置PERL5OPT环境变量。该变量可以为Perl解释器保存额外的命令行标志。但是,这会影响脚本直接或间接启动的所有Perl进程,而不仅仅是作为项目一部分的那些脚本。

要自动use Logging,您需要将-MLogging添加到PERL5OPT。在外壳:

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

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

或内execute.pl

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