从父进程在Perl中的子进程继承的模块
问题描述:
- 我正在将一个日志框架集成到我的perl项目,该项目有大约300个Perl文件的 。
- 所以我写了一个模块
Logging.pm
已覆盖die
,say
,warn
功能和自print
不能被重写我已经绑我的自定义手柄。 - 我有一个主脚本
execute.pl
它通过system
/qx
/exec
执行所有脚本。 - 我想包括在短短
execute.pl
Logging.pm
和所有的Logging.pm
的 功能应通过system()
或qx()
或exec()
通过execute.pl执行的子 过程将支援。执行的
execute.pl -> system("test1.pl") -> system("test2.pl")
所以test1.pl
和test2.pl
应该拿起重写die/warn/say/print
如果我只是包括excute.pl
Logging.pm
。
据我所知system/qx/exec
将OS调用和Logging.pm
将不会在子进程中可用,有没有什么办法可以实现这一点,因为我不想编辑300个文件?
答
由于子流程是完全独立的流程,它们不会保留父流程加载的任何模块。
解决此问题的一种可能性是设置PERL5OPT
环境变量。该变量可以为Perl解释器保存额外的命令行标志。但是,这会影响脚本直接或间接启动的所有Perl进程,而不仅仅是作为项目一部分的那些脚本。
要自动use Logging
,您需要将-MLogging
添加到PERL5OPT
。在外壳:
$ export PERL5OPT="$PERL5OPT -MLogging"
$ ./execute.pl
或
$ PERL5OPT="$PERL5OPT -MLogging" ./execute.pl
或内execute.pl
:
$ENV{PERL5OPT} .= " -MLogging";