Perl会在当前目录.
中查找模块吗?
我无法直接安装模块,我想我可以将其复制到本地目录中。这是真的吗?
perl -V
会打印出关于您的Perl安装的各种属性,包括默认的@INC
。您应该注意到其中有一个.
:是的,默认情况下会在当前工作目录中搜索模块。
(如果没有,请使用环境变量PERL5LIB
或PERLLIB
,或在命令行上使用-I
,或将sitecustomize.pl
添加到perl -V:sitelib
。)
针对Cameron和tchrist在ephemient的回答中的评论讨论。
您可以使用此代码段来使用与脚本在同一目录中的模块,即使在执行脚本时位于其他目录中也可以使用。
use Cwd 'abs_path';
use File::Basename;
use lib dirname( abs_path $0 );
应该在所有情况下和所有操作系统上都可以工作。(来源:http://use.perl.org/~Aristotle/journal/33995)
FindBin
模块?那个模块确实做了更多的事情,比如理解脚本是否是符号链接,并通过首先读取链接内容来解析它。 - tchrist@INC
中的.
,即这种默认行为计划在Perl 5.26中删除。请参阅开发版本发布说明:https://metacpan.org/pod/release/EXODIST/perl-5.25.7/pod/perldelta.pod#and-INC。一般认为这样做是为了解决因此行为而引起的某些应用程序中发现的漏洞。CVE(s)尚未公开发布。Perl在搜索模块时会在@INC
数组中搜索目录。
请参考以下Stack Overflow问题,了解如何构建该数组(这将告诉您如何添加当前或主目录):
请参考以下Stack Overflow问题,了解Perl如何找到模块的实际文件:
.
)是一个不好的主意。 - DVK当您解压缩模块的tarball目录时,请使用可选库参数构建其Makefile
,并将模块内容放置在您想要的任何个人目录中的名称下:
$ perl Makefile.PL LIB=~/perllibs
然后确保你的~/perllibs
目录已经包含在你的$PERL5LIB
环境变量中。
$FindBin::Bin
完全不同! - tchristuse FindBin; use lib $FindBin::Bin;
。你绝对不想冒险依赖于某人上次cd到哪里时加载你自己程序的重要组件而出现问题。 - tchrist