Perl会在当前目录(.)中查找模块吗?

4

Perl会在当前目录.中查找模块吗?

我无法直接安装模块,我想我可以将其复制到本地目录中。这是真的吗?

6个回答

14

perl -V会打印出关于您的Perl安装的各种属性,包括默认的@INC。您应该注意到其中有一个.:是的,默认情况下会在当前工作目录中搜索模块。

(如果没有,请使用环境变量PERL5LIBPERLLIB,或在命令行上使用-I,或将sitecustomize.pl添加到perl -V:sitelib。)


4
将东西安装到进程的当前工作目录,即“dot”中,实际上并不起作用,也不应该依赖它。这与 $FindBin::Bin 完全不同! - tchrist
@tchrist:到底是什么不起作用?我有一种感觉,我在这里可能错过了些微妙之处... - Cameron
6
@Cameron:仅仅依赖于进程的cwd()是非常不可靠的;这意味着你必须在特定目录下运行特定程序,这太疯狂了。如果你想将模块放在与主脚本本身相同的起始目录中,你需要使用use FindBin; use lib $FindBin::Bin;。你绝对不想冒险依赖于某人上次cd到哪里时加载你自己程序的重要组件而出现问题。 - tchrist
@tchrist:+1,好观点!我现在明白你的意思了,感谢你澄清。 - Cameron

6

有没有特别的原因要重新实现标准的 FindBin 模块?那个模块确实做了更多的事情,比如理解脚本是否是符号链接,并通过首先读取链接内容来解析它。 - tchrist
我找到了一段时间前我自己尝试回答这个问题时引用的链接。在那个链接中,他们讨论了FindBin的限制,我承认我不确定是否理解,然后他们选择了这个代码片段作为通用应用工具。自从那时以来,我已经多次使用它并取得了良好的结果,所以我想我再也没有回头看过去了。他们的担忧是否合理,或者我将来应该转向FindBin? - Joel Berger
我还看到了一个名为scriptname的新CPAN模块(http://search.cpan.org/perldoc?scriptname),您对此有何想法? - Joel Berger
链接似乎已经失效(超时 - 在子域名“use.perl.org”上没有响应,而“perl.org”可以正常工作)。 - Peter Mortensen

5

这听起来是一个很好的安全措施。六年前(哇!)我想这么做的原因是我的网站使用了雅虎网络托管,而它并不是真正的安全:mod_perl 存在安全漏洞(或配置文件编写得很差),会给我读/执行权限,但实际上我不应该拥有这些权限。有一个 Perl 模块我想要安装,但由于没有 /usr 的写入权限,我无法安装它,但想法是将其放在 ./ 中,并通过我的执行权限加载它。最终这个模块变得不重要了(IO::Compress 或其他什么),但这个问题应该被解决。 - Leo Izen
由于根节点配置错误,它实际上给了我一些不应该拥有的写入权限。服务器与一些家庭成员共享,我应该对/leo/目录拥有权限,但是它没有被挂载为我的/。因此,我可以操纵其他人的文件。我只是利用它在空闲时间为他们修复脚本中的错误,但这仍然很糟糕。 - Leo Izen
需要更新时间了吗? - Peter Mortensen

1

正如tchrist的回答中所指出的那样,通常情况下使用当前目录(例如.)是一个不好的主意。 - DVK

0

当您解压缩模块的tarball目录时,请使用可选库参数构建其Makefile,并将模块内容放置在您想要的任何个人目录中的名称下:

$ perl Makefile.PL LIB=~/perllibs

然后确保你的~/perllibs目录已经包含在你的$PERL5LIB环境变量中。


0

我认为默认情况下它很可能会这样做,就像this post中所示。如果您的实现没有这样做,那么该帖子中初始问题引用的语法将允许您引用所需的模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接