关于perl“use”关键字

时间:2013-08-30 07:52:39

标签: perl perl-module

我现在有一个perl文件test.pl,它必须引用其他perl模块Hello.pm,Hello.pm和test.pl在同一目录下,并且包名声明 Hello.pm是package MRS::scripts::Hello。那么,我应该如何在test.pl?

中使用模块Hello.pm

我尝试了use Hellouse MRS::scripts::Hello,但系统无法在@INC中找到Hello.pm。 怎么了?

2 个答案:

答案 0 :(得分:3)

use获取包名称。然后,它会将每个::更改为/之类的路径分隔符,并附加.pm。因此,正确的用法是use Hello;

这里有一个问题:Hello.pm必须位于@INC的一个根目录下。在我的一个perls上,@INC有像

这样的条目
/home/amon/.config/perlbrew/perls/perl-5.18.1/lib/site_perl/5.18.1/i686-linux-thread-multi-64int
/home/amon/.config/perlbrew/perls/perl-5.18.1/lib/site_perl/5.18.1
/home/amon/.config/perlbrew/perls/perl-5.18.1/lib/5.18.1/i686-linux-thread-multi-64int
/home/amon/.config/perlbrew/perls/perl-5.18.1/lib/5.18.1
.

最后一个很有趣:.代表当前的工作目录。不幸的是,这并不总是与脚本的位置相匹配。我们可以使用FindBin模块来解决这个问题:

use FindBin;             # get the script location, populates $FindBin::Bin
use lib $FindBin::Bin;   # tell perl to look for modules next to your script
use MRS::scripts::Hello; # load your module

...假设模块位于文件$FindBin::Bin/MRS/scripts/Hello.pm中。

答案 1 :(得分:2)

如果包名称为MRS::scripts::Hello,则perl会搜索MRS/scripts/Hello.pm。创建目录结构,或从模块文件中删除命名空间。

换句话说,三个事物必须符合:文件路径,包名称和use的参数。

如果要更改包名称,请注意。如果脚本中有任何命名空间(完全限定名称),您也应该更改它们。