2017-10-04 70 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";