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