perl是否会查看。 (当前目录)模块?我无法直接安装模块,我想我可以将其复制到本地目录中。这是真的吗?
答案 0 :(得分:14)
perl -V
将打印出有关Perl安装的各种属性,包括默认的@INC
。您应该注意到.
:是的,默认情况下会搜索当前工作目录的模块。
(如果没有,您可以在命令行中使用环境变量PERL5LIB
或PERLLIB
或-I
,或者向sitecustomize.pl
添加perl -V:sitelib
。 )
答案 1 :(得分:6)
回应Cameron和tchrist在其中一个答案的评论中的讨论。
您可以使用此代码段在与脚本相同的目录中使用模块,即使脚本在另一个目录中执行也是如此。
use Cwd 'abs_path';
use File::Basename;
use lib dirname( abs_path $0 );
应该适用于所有情况和所有操作系统。 (来源:http://use.perl.org/~Aristotle/journal/33995)
答案 2 :(得分:5)
最近有一些理由不依赖于.
比平时多@INC
,即在Perl 5.26中计划删除此默认行为。请参阅此处的开发发行说明:https://metacpan.org/pod/release/EXODIST/perl-5.25.7/pod/perldelta.pod#and-INC
众所周知,这样做是为了解决由于此行为而在某些应用程序中发现的漏洞。 CVE尚未公开发布(尚未发布)。
答案 3 :(得分:0)
我认为最有可能默认情况下,如this post所示。如果您的实现没有这样做,那么该帖子的初始问题中引用的语法将允许您引用所需的模块。
答案 4 :(得分:0)
解压缩模块的tarball目录时,使用可选的库参数构建其Makefile
,其中包含您希望放置模块内容的个人目录的名称:
$ perl Makefile.PL LIB=~/perllibs
然后确保您的~/perllibs
envariable中包含$PERL5LIB
目录。
答案 5 :(得分:0)
Perl在搜索模块时搜索@INC
数组中的目录。
请参考以下关于如何构造该数组的问题(这将告诉您如何添加当前或主目录):
请参阅以下有关Perl如何找到模块实际文件的问题:
How does a Perl program know where to find the file containing Perl module it uses?