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

knsnq2tg  于 2022-12-27  发布在  Perl
关注(0)|答案(3)|浏览(154)

我从来没有完全理解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找不到www.example.com。查看@INC,它不包括当前目录,只包括我的Strawberry Perl安装的各个目录。
解决这个问题的推荐方法是什么?我想我可以修改@INC,或者我可以开始使用FindBin,但我不确定哪一个是最好的。我继承了这段代码,只是将它迁移到一个新的位置,但它看起来不像旧代码需要任何这样的解决方案(我可能是错的,仍然在寻找...)

6fe3ivhb

6fe3ivhb1#

Perl从未在脚本目录中搜索模块。
Perl确实搜索了当前目录,这是因为当前目录有时与脚本目录相同,Perl搜索脚本的目录。
但是当前目录通常与脚本目录不同,所以像您这样假设Perl在脚本目录中搜索模块的代码总是有缺陷的。
从5.26开始,Perl出于安全原因不再搜索当前目录,这只会使bug更加明显。
要告诉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 ) );
roejwanj

roejwanj2#

由于安全原因(CVE-2016-1238),在@INC中保留.(当前目录)在5.26中被删除了。一些Linux发行版已经向后移植了这一更改,所以即使您使用的是5.24,也可能会遇到这个问题。

vxf3dgd4

vxf3dgd43#

Perl 5.26删除了@INC中的当前工作目录作为安全措施。
在5.26 perldelta笔记中有解释。

相关问题