2
  • 我正在将一个日志框架集成到我的 perl 项目中,该项目有大约 300 个 Perl 文件。
  • 因此,我编写了一个模块,该模块Logging.pm具有被覆盖die的 , say,warn功能,并且由于print无法被覆盖,因此我将其绑定为我的自定义句柄。
  • 我有一个主脚本execute.pl,它通过system//执行所有脚本qxexec
  • 我想Logging.pm在execute.pl 通过or or 执行的子进程中包含execute.pl所有功能 。Logging.pmsystem()qx()exec()

执行示例:

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

因此,test1.pl如果test2.pldie/warn/say/print只包含Logging.pmexcute.pl.

据我所知system/qx/exec,将是操作系统调用并且Logging.pm在子进程中不可用,有什么办法可以实现这一点,因为我不想编辑 300 个文件?

4

1 回答 1

2

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

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

要自动use Logging添加-MLoggingPERL5OPT. 在外壳中:

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

或者

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

或在execute.pl

$ENV{PERL5OPT} .= " -MLogging";
于 2017-10-04T09:33:15.017 回答