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

Ste*_*hen 12 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;)
Run Code Online (Sandbox Code Playgroud)

但是,这在我的代码中不起作用,因为无法找到Class3.pm.看看@INC,它不包括当前目录,只包含我的Strawberry Perl安装的各种目录.

推荐的解决方法是什么?我想我可以修改@INC,或者我可以开始使用FindBin,但我不确定哪个是最好的.我继承了这段代码并且只是将它迁移到一个新的位置,但它看起来不像旧的代码需要这样的解决方案(我可能是错的,仍在寻找......)

ike*_*ami 24

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

但是,任何依赖于当前目录的代码都是在@INC5.26之前的错误.像您这样执行此操作的代码错误地将当前目录用作脚本目录的代理.这种假设通常是不正确的.

要告诉Perl在脚本的目录中查找模块,请使用以下命令:

use FindBin 1.51 qw( $RealBin );
use lib $RealBin;
Run Code Online (Sandbox Code Playgroud)

要么

use Cwd qw( abs_path );
use File::Basename qw( dirname );
use lib dirname(abs_path($0));
Run Code Online (Sandbox Code Playgroud)

  • @textral,`__FILE__`和`$0`之间没有区别(除非你改变了`$0`,所以`__FILE__`稍微好一点)。那不是问题。问题是您使用了 `realpath(dirname(__FILE__))` 而不是 `dirname(realpath(__FILE__))`。如果使用符号链接,您的方法将会失败。 (2认同)

mel*_*ene 7

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


ste*_*ieb 5

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

它在5.26 perldelta笔记中有解释.