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
语句,默认情况下它将位于packagemain
中
(如果您负责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();