我从未完全理解 Perl 的包名称解析,但我总是假设以下内容应该始终有效,假设您从包含它的目录中执行 myscript.pl:
myscript.pl (contains the following statement: use Class1::Class2::Class3)
Class1/
Class2/
Class3.pm (contains the following package declaration: package Class1::Class2::Class3;)
但是,这在我的代码中不起作用,因为无法找到 Class3.pm。查看@INC,它不包括当前目录,只包括我的 Strawberry Perl 安装的各个目录。
解决这个问题的推荐方法是什么?我想我可以修改@INC,或者我可以开始使用FindBin,但我不确定哪个是最好的。我继承了这段代码,只是将其迁移到新位置,但旧代码看起来并不需要这样的解决方案(我可能是错的,仍在寻找......)
要告诉 Perl 在脚本目录中查找模块,请将以下内容添加到脚本中:
use FindBin 1.51 qw( $RealBin );
use lib $RealBin;
或
use Cwd qw( abs_path );
use File::Basename qw( dirname );
use lib dirname( abs_path( $0 ) );
Perl 从未在脚本目录中搜索模块。
Perl 确实搜索了当前目录。正是因为当前目录有时与脚本目录相同,才出现 Perl 搜索脚本目录的情况。
但是当前目录通常与脚本的目录不同。因此,像您这样假设 Perl 在脚本目录中搜索模块的代码始终存在错误。
从 5.26 开始,出于安全原因,Perl 不再搜索当前目录。这只会让错误更加明显。
.
中的
@INC
(当前目录)已在 5.26中被删除(CVE-2016-1238)。一些 Linux 发行版已经向后移植了更改,因此即使您使用的是例如,也可能会遇到此问题。 5.24.