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

问题描述 投票:0回答:3

我从未完全理解 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
3个回答
41
投票

要告诉 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 不再搜索当前目录。这只会让错误更加明显。


11
投票
出于安全原因,

.

 中的 
@INC
(当前目录)已在 5.26
中被删除(CVE-2016-1238)。一些 Linux 发行版已经向后移植了更改,因此即使您使用的是例如,也可能会遇到此问题。 5.24.


7
投票
@INC

中的当前工作目录作为安全措施。


5.26 perldelta 注释中进行了解释

© www.soinside.com 2019 - 2024. All rights reserved.