Perl 为什么我不能调用模块';需要或成功使用后的s功能?

Perl 为什么我不能调用模块';需要或成功使用后的s功能?,perl,require,perl-module,subroutine,Perl,Require,Perl Module,Subroutine,我有一个名为genbank.pm的Perl模块文件,它有一个子例程new;此Perl模块没有使用导出器,也没有定义@EXPORT或@EXPORT\u OK。在同一目录中,我有一个名为test.pl的Perl文件,test.pl的代码是: require 'genbank.pm'; use strict; our $result = genbank::new(); 当我使用Komodo运行它时,它会报告: Undefined subroutine &genbank::new called

我有一个名为
genbank.pm
的Perl模块文件,它有一个子例程
new
;此Perl模块没有使用
导出器
,也没有定义
@EXPORT
@EXPORT\u 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();

它说:


无法通过/home/mrs/scripts/test.pl第3行的包“genbank”(可能您忘记加载“genbank”?)找到对象方法“new”。
您没有提供足够的信息来完全确定问题,但最有可能的原因是
new
子对象位于
genbank
以外的包中

当您尝试调用
genbank::new
(或
genbank->new
)时,Perl在包
genbank
中查找名为
new
的子项,而不是在文件
genbank.pm
中。按照惯例,文件
genbank.pm
将包含一个名为
genbank
的包,但这纯粹是惯例和方便的问题。它不是由该语言强制执行的,并且在文件名和包名之间绝对没有自动连接

要了解您的SUB放在哪个软件包中,请在
genbank.pm
中查找任何显示
package xxxx的行。在
sub new
行之前出现的最后一个将告诉您
new
所属的包。如果在其定义之前没有
package
语句,默认情况下它将位于package
main

(如果您负责
genbank.pm
源代码,我还建议将
package genbank;
添加到文件中,或者重命名该文件以匹配其实际包含的包,以避免将来出现此类混淆。)

编辑OP的评论:

由于模块当前以
package MRS::Scripts::genbank
开头,因此创建
new
子模块的就是这个包。您有两种选择来调用它:

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

  • 将其从
    MRS::Scripts::genbank
    包中导出,并修改调用脚本以从该包中导入符号(将
    genbank.pm
    移动到
    MRS/Scripts/genbank.pm
    并将
    require
    更改为
    use-MRS::Scripts::genbank;
    或在
    require
    之后添加
    MRS::Scripts::genbank->import;
    ),然后将其称为
    new()
    。虽然这在您问题的有限范围内有效,但我强烈建议您不要这样做,因为一旦您对另一个包含
    子新的
    的模块重复此操作,它将全部崩溃,因为不可能在同一位置同时有两个
    新的


  • 解决此问题的最干净的方法是将
    genbank.pm
    移动到
    MRS/Scripts/genbank.pm
    ,将
    require
    更改为
    require-MRS::Scripts::genbank.pm
    (或
    使用
    ;如果不导出任何内容,它们是等效的),然后调用sub作为
    MRS::Scripts::genbank::new
    MRS::Scripts::genbank->new
    。这种方法将使文件名和包名彼此同步,这将使将来必须维护代码的人(可能是您)的生活更加轻松.

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

    当您尝试调用
    genbank::new
    (或
    genbank->new
    )时,Perl在包
    genbank
    中查找名为
    new
    的子包,而不是在文件
    genbank.pm
    中。按照惯例,文件
    genbank.pm
    将包含名为
    genbank
    的包,但这纯粹是一个惯例和方便的问题。它不是由该语言强制执行的,并且有绝对没有文件名和包名之间的自动连接

    要了解您的sub放在哪个软件包中,请在
    genbank.pm
    中查找任何写有
    package xxxx;
    的行。出现在
    sub new
    行之前的最后一行将告诉您
    new
    所属的软件包。如果在其定义之前没有
    package
    语句,它将位于默认情况下,e程序包
    main

    (如果您负责
    genbank.pm
    源代码,我还建议将
    package genbank;
    添加到文件中,或者重命名该文件以匹配其实际包含的包,以避免将来出现此类混淆。)

    编辑OP的评论:

    由于模块当前以
    package MRS::Scripts::genbank
    开头,因此创建新的
    子模块的包就在这个包中。您有两个选项可以调用它:

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

  • 将其从
    MRS::Scripts::genbank
    包导出,并修改调用脚本以从该包导入符号(通过将
    genbank.pm
    移动到
    MRS/Scripts/genbank.pm
    并更改
    r
    
    our $result = genbank->new();