[英]How to load module not in INC in Perl during runtime?
如何在Perl中加載不在@INC中的路徑的模塊?
我已經閱讀了如何添加@INC路徑的答案,但問題是必須在代碼的開頭更改@INC。 編譯完成后,我遇到的所有模塊都會查找@INC以查找模塊的位置。 我的問題是我們試圖將所有這些環境特定的東西分離到配置文件中。 如果它在配置文件中,則需要先讀取路徑才能將其推送到@INC,但是代碼已經編譯好了,似乎無法修改@INC。
Perl有一個增量編譯模型,這意味着可以在解析其他代碼之前執行代碼。 為此,我們可以使用相位塊 (又名相位器 ):
BEGIN {
print "This is executed as soon as the block has been parsed\n";
}
這樣的相位塊也可以用於加載配置文件。
例如, use
語句對於BEGIN
塊是有效的語法糖。
use Foo::Bar qw/baz qux/;
相當於
BEGIN {
require Foo::Bar; # or: require "Foo/Bar.pm";
Foo::Bar->import(qw/baz qux/);
}
我們也可以在運行時加載模塊,盡管這只適用於面向對象的模塊。
所以我們有三個選擇:
BEGIN
階段加載配置並在加載實際模塊之前添加正確的庫路徑 BEGIN
期間手動加載模塊及其完整路徑(例如, require "/my/modules/Foo/Bar.pm"
使用裸require
相當不舒服,這就是Module::Runtime
存在的原因
use only { versionlib => '/home/ingy/modules' },
MyModule => 0.33;
它必須與版本條件一起使用,但無論如何都要放在這里,因為它與我的問題1相關,並且我無法在第一時間找到任何模塊,允許在@INC之外的路徑。
根據perlfaq的說法 , 要求可以采取完整的路徑
require "$ENV{HOME}/lib/Foo.pm"; # no @INC searching!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.