从当前目录调用Perl模块

3

我需要在远程服务器上测试一个Perl脚本。我尝试运行它,但是出现了错误。

Can't locate Date/Manip.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl . 

我下载了DateManip.pm文件并尝试将其复制到其中一个位置。但是我没有权限将文件复制到任何这些位置。我是否可以将此*.pm文件放在自己的目录中并从那里调用它,还是必须将它放在这些位置之一?


相关有用文章:如何更改@INC以在非标准位置查找Perl模块 - Pablo Bianchi
2个回答

7

正确的做法是显然安装DateManip.pm,但如果由于某些原因无法这样做,则可以将模块复制到任何具有写权限的目录中,并修改perl脚本以包含以下内容:

 use FindBin qw($Bin);
 use lib "$Bin/<relative_path_to_module>";

<relative_path_to_module> 是指 DateManip.pm 所在目录的相对路径。因此,如果模块的相对路径是 ../lib,则应该写为

use FindBin qw($Bin);
use lib "$Bin/../lib";

出现了以下编程错误 - “$BIN”未被FindBin模块导出。 - sfactor
1
大小写很重要...应该是$Bin而不是$BIN。 - ennuikiller

3

默认情况下,Perl也会在当前目录(运行它的目录)中查找模块。因此,以下代码可以正常工作:

./your_program.pl     <= "use DateManip"
./DateManip.pm

如果模块被称为Date :: Manip,则结构应该像这样:
./your_program.pl     <= "use Date::Manip"
./Date/
./Date/Manip.pm

Perl 5.22.1上有效吗?我将我的模块放在当前目录中,一切都正常运行...但是B::Lint抱怨“无法在@INC中找到Mymodule.pm”。 - Pablo Bianchi
@PabloBianchi - 是的,在Perl 5.22上是有效的。但从Perl 5.26开始,默认情况下不再有效- http://perldoc.perl.org/perldelta.html#Removal-of-the-current-directory-(%22.%22)-from-%40INC - draegtun
1
Perl 5.26及更高版本中是否有解决方法? - Marc Elser
@draegtun的链接现在显示的是一个更新的变更日志,而不是原本打算的那个。5.26.0变更日志的永久链接:https://perldoc.perl.org/5.26.0/perldelta#Removal-of-the-current-directory-%28%22.%22%29-from-%40INC - Hippo

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