为什么我不能在需要或成功使用后调用模块的功能?

时间:2013-08-30 08:44:45

标签: perl require perl-module subroutine

我有一个名为genbank.pm的Perl模块文件,它有一个子程序new;此Perl模块未使用Exporter,未定义@EXPORT@EXPORT_OK。在同一目录中,我有一个名为test.pl的Perl文件,test.pl的代码是:

require 'genbank.pm';
use strict;
our $result = genbank::new();

当我用Komodo运行它时,它会报告:

Undefined subroutine &genbank::new called at /home/mrs/scripts/test.pl line 3;

我从

更改代码后
our $result = genbank::new();

our $result = genbank->new();
它说:

Can't locate object method "new" via package "genbank"(perhaps you forgot to load "genbank"?) at /home/mrs/scripts/test.pl line 3.

1 个答案:

答案 0 :(得分:3)

您没有提供足够的信息来完全确定问题,但最可能的原因是new sub位于genbank以外的包中。

当您尝试拨打genbank::new(或genbank->new)时,Perl会在包new中查找名为genbank的子徽标,不是在文件genbank.pm中。按照惯例,文件genbank.pm将包含一个名为genbank的包,但这纯粹是一个常规和方便的问题。该语言强制,文件名和包名称之间存在绝对没有自动连接。

要了解您的潜水员所在的套餐,请查看genbank.pm以查找package xxxx;的任何行。在sub new行之前显示的最后一个将告诉您new所属的包。如果在定义之前没有package语句,则默认情况下它将位于包main中。

(如果您负责genbank.pm源代码,我还建议将package genbank;添加到文件中或重命名文件以匹配它实际包含的包,以避免这种情况未来的混乱。)

根据OP的评论进行编辑:

由于模块当前以package MRS::Scripts::genbank开头,那么就是创建new子包的包。您有两个选项可以调用它:

  1. 将其称为MRS::Scripts::genbank::new(或者,如果它实际上是对象构造函数,则为MRS::Scripts::genbank->new)。如果要使用包名称调用它,则必须使用正确的包名称。

  2. MRS::Scripts::genbank包中导出并修改您的调用脚本以从该包中导入符号(将genbank.pm移至MRS/Scripts/genbank.pm并更改require通过在use MRS::Scripts::genbank;之后添加MRS::Scripts::genbank->import;require ,然后将其称为new()。虽然这可以在你的问题的有限范围内工作,但我建议强烈反对它,因为一旦你用另一个包含sub new的模块重复这个,它就会全部崩溃,因为在同一个地方不能同时有两个new

  3. 解决此问题的最简单方法是将genbank.pm移至MRS/Scripts/genbank.pm,将require更改为require MRS::Scripts::genbank.pm(或use;如果您不知道t导出任何内容,它们是等效的),然后将该子调用为MRS::Scripts::genbank::newMRS::Scripts::genbank->new。这种方法将使文件名和包名彼此同步,这将使以后必须维护代码的人更容易生活(可能是你......)。