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