我现在有一个perl文件test.pl,它必须引用其他perl模块Hello.pm,Hello.pm和test.pl位于同一个目录中,并且包名声明 .pm是package MRS::scripts::Hello
。那么,我应该如何在test.pl中使用模块Hello.pm?关于perl“使用”关键字
我试过use Hello
和use MRS::scripts::Hello
,但系统在@INC中找不到Hello.pm。 有什么问题?
我现在有一个perl文件test.pl,它必须引用其他perl模块Hello.pm,Hello.pm和test.pl位于同一个目录中,并且包名声明 .pm是package MRS::scripts::Hello
。那么,我应该如何在test.pl中使用模块Hello.pm?关于perl“使用”关键字
我试过use Hello
和use MRS::scripts::Hello
,但系统在@INC中找不到Hello.pm。 有什么问题?
如果软件包名称为MRS::scripts::Hello
,则perl会搜索MRS/scripts/Hello.pm
。可以创建目录结构,也可以从模块文件中删除命名空间。
换句话说,有三个必须一致的东西:文件路径,包名称和use
的参数。
如果要更改软件包名称,请注意。如果脚本中有任何关于名称空间(完全限定名称)的提及,则应该更改它们。
use
取包名称。然后它将每个::
更改为路径分隔符,如/
并附加.pm
。因此,正确的用法是use Hello;
。
这里有一个问题:Hello.pm
必须在@INC
的根源之一。在我的皮尔斯之一,@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
英寸
为了'use'成功导入模块导出的任何符号,'use'必须与文件中的'package'匹配,所以'use Hello'不正确。该文件需要放在'@ INC'目录下的'MRS/scripts/Hello.pm',然后'使用MRS :: scripts :: Hello'。 –
@DaveSherohman谢谢你的收获! – amon
此外,请确保将所需的路径添加到@INC,如果它尚不存在。 – Vince