Perl默认情况下不包含@INC中的当前目录吗?

时间:2017-10-03 16:52:58

标签: perl

我从未完全理解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,但我不确定哪个是最好的。我继承了这段代码,只是将它迁移到一个新的位置,但它看起来不像旧的代码需要这样的解决方案(我可能是错的,仍在寻找......)

3 个答案:

答案 0 :(得分:17)

Perl不会在当前目录中搜索模块或脚本的模块目录,至少不再搜索。出于安全原因,当前目录已从5.26中的@INC中删除。

但是,依赖于@INC中当前目录的任何代码都远远超过了5.26。像您这样执行此操作的代码错误地将当前目录用作脚本目录的代理。这种假设通常是不正确的。

要告诉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));

答案 1 :(得分:6)

出于安全原因(removed in 5.26),.中的@INC(当前目录)为CVE-2016-1238。某些Linux发行版已向后移植了更改,因此即使您正在使用例如,也可能遇到此问题。 5.24。

答案 2 :(得分:5)

删除了Perl 5.26,将@INC中的当前工作目录作为安全措施。

5.26 perldelta notes中解释了它。