簡體   English   中英

如何在運行時在Perl中加載不在INC中的模塊?

[英]How to load module not in INC in Perl during runtime?

如何在Perl中加載不在@INC中的路徑的模塊?

我已經閱讀了如何添加@INC路徑的答案,但問題是必須在代碼的開頭更改@INC。 編譯完成后,我遇到的所有模塊都會查找@INC以查找模塊的位置。 我的問題是我們試圖將所有這些環境特定的東西分離到配置文件中。 如果它在配置文件中,則需要先讀取路徑才能將其推送到@INC,但是代碼已經編譯好了,似乎無法修改@INC。

  1. 有辦法嗎? 是否有一個庫可以讓我加載一個模塊並傳遞一個自定義路徑?
  2. 這是一件可怕的壞事嗎? 為什么?

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/);
}

我們也可以在運行時加載模塊,盡管這只適用於面向對象的模塊。

所以我們有三個選擇:

  1. BEGIN階段加載配置並在加載實際模塊之前添加正確的庫路徑
  2. BEGIN期間手動加載模塊及其完整路徑(例如, require "/my/modules/Foo/Bar.pm"
  3. 在運行時計算出配置,然后加載模塊。

使用裸require相當不舒服,這就是Module::Runtime存在的原因

使用BEGIN塊加載自定義的@INC位置,然后use lib包含它。

# use lib /a special directory/
BEGIN {
    my $lib_to_include = ...;

    require lib;
    lib->import($lib_to_include);
}

use Module_That_Requires_Special_Dir;

唯一需要注意的是,無論用於加載自定義包含目錄的代碼,都必須依賴於此BEGIN塊之前已定義的方法。 因此,您無法使用稍后在文件中的子例程。

只是遇到 ,似乎讓路徑傳遞給use參數,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM