【问题标题】:About perl "use" keyword关于 perl "use" 关键字
【发布时间】:2013-09-02 21:03:30
【问题描述】:

我现在有一个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。 怎么了?

【问题讨论】:

    标签: perl perl-module


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果还没有所需的路径,请确保将所需的路径添加到@INC。
    【解决方案2】:

    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中。

    【讨论】:

    • use要成功导入模块导出的任何符号,use必须与文件中的package匹配,所以use Hello不正确。该文件需要放在MRS/scripts/Hello.pm@INC 目录下,然后是use MRS::scripts::Hello
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2017-05-07
    • 2015-05-19
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2023-02-21
    • 2016-01-19
    相关资源
    最近更新 更多