Perl,不能从@INC

时间:2017-05-31 15:46:56

标签: perl package

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

BEGIN inited,我检查@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();

我得到了"尝试......"和"失败"。用完整路径试过use lib - 一无所获。我做错了什么?

1 个答案:

答案 0 :(得分:5)

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

my $path = "/path/to/lib";
require "$path/DIR/Module.pm";

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

use FindBin qw( $RealBin );

my $path = "$RealBin/../lib";
require "$path/DIR/Module.pm";

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

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

use lib qw( /path/to/lib );
use DIR::Module;

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

use FindBin qw( $RealBin );
use lib "$RealBin/../lib";
use DIR::Module;