我现在有一个perl文件test.pl,它必须引用其他perl模块Hello.pm,Hello.pm和test.pl在同一目录下,并且包名声明
Hello.pm是package MRS::scripts::Hello
。那么,我应该如何在test.pl?
我尝试了use Hello
和use MRS::scripts::Hello
,但系统无法在@INC中找到Hello.pm。
怎么了?
答案 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
的参数。
如果要更改包名称,请注意。如果脚本中有任何命名空间(完全限定名称),您也应该更改它们。