2013-08-30 47 views
0

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

我试过use Hellouse MRS::scripts::Hello,但系统在@INC中找不到Hello.pm。 有什么问题?

回答

2

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

换句话说,有三个必须一致的东西:文件路径,包名称和use的参数。

如果要更改软件包名称,请注意。如果脚本中有任何关于名称空间(完全限定名称)的提及,则应该更改它们。

+0

此外,请确保将所需的路径添加到@INC,如果它尚不存在。 – Vince

3

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英寸

+3

为了'use'成功导入模块导出的任何符号,'use'必须与文件中的'package'匹配,所以'use Hello'不正确。该文件需要放在'@ INC'目录下的'MRS/scripts/Hello.pm',然后'使用MRS :: scripts :: Hello'。 –

+0

@DaveSherohman谢谢你的收获! – amon