Perl,不能从@INC动态地需要一个模块

gen*_*si5 0 perl package

所以,我有一个加载模块的问题require.我们有一个工作目录.该程序加载一个PACKAGE(粗体不会让你困惑)(这是好的 - 多亏了正确的本地命名空间),但它必须从非常不同的目录加载另一个模块.因此,当我听说过,应该不移位到@INCBEGIN块.但是....这个开始应该采用一个参数(目前来自初始程序),包含一些配置文件的路径,其中包含我需要的参数(模块的路径,我需要取消移位).

BEGINinited,我检查@INC - unshift似乎成功了.然后,在PACKAGE方法中我们需要加载此模块,但是当我尝试执行以下操作时:

eval{
    print STDERR "Trying...\n";
    my $path = "path/to/module"; # contains "DIR" dir and "Module.pm", 
    # also tried to write this path as "path/to/module/DIR/Module.pm"
    require $path;
    DIR::Module->import();
    print STDERR "Success\n";
    1;
} or {print STDERR "Failed\n";}

my $module = DIR::Module->new();
Run Code Online (Sandbox Code Playgroud)

我得到了"试着......"和"失败".试过全use lib路径 - 什么也没得到.我究竟做错了什么?

ike*_*ami 5

你说$path是模块的路径,但你也说它是包含目录的路径DIR/Module.pm.我假设它是后者,因为它需要是前者.

my $path = "/path/to/lib";
require "$path/DIR/Module.pm";
Run Code Online (Sandbox Code Playgroud)

$RealBin如果路径相对于您的脚本,请记住使用.

use FindBin qw( $RealBin );

my $path = "$RealBin/../lib";
require "$path/DIR/Module.pm";
Run Code Online (Sandbox Code Playgroud)

请注意,从动态加载的模块导入很少有意义.


如果没有理由避免在编译时加载这个模块,我会选择

use lib qw( /path/to/lib );
use DIR::Module;
Run Code Online (Sandbox Code Playgroud)

同样,请记住使用$RealBin路径是否与脚本相关.

use FindBin qw( $RealBin );
use lib "$RealBin/../lib";
use DIR::Module;
Run Code Online (Sandbox Code Playgroud)