0

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

我试过use Helloand use MRS::scripts::Hello,但系统在 @INC 中找不到 Hello.pm。怎么了?

4

2 回答 2

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

于 2013-08-30T08:02:05.883 回答
2

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

换句话说,有件事必须一致:文件路径、包名和use.

如果要更改包名称,请小心。如果脚本中提到了命名空间(完全限定的名称),您也应该更改它们。

于 2013-08-30T07:57:47.847 回答