我有一个名为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.
答案 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
子包的包。您有两个选项可以调用它:
将其称为MRS::Scripts::genbank::new
(或者,如果它实际上是对象构造函数,则为MRS::Scripts::genbank->new
)。如果要使用包名称调用它,则必须使用正确的包名称。
从MRS::Scripts::genbank
包中导出并修改您的调用脚本以从该包中导入符号(将genbank.pm
移至MRS/Scripts/genbank.pm
并更改require
通过在use MRS::Scripts::genbank;
之后添加MRS::Scripts::genbank->import;
来require
或,然后将其称为new()
。虽然这可以在你的问题的有限范围内工作,但我建议强烈反对它,因为一旦你用另一个包含sub new
的模块重复这个,它就会全部崩溃,因为在同一个地方不能同时有两个new
。
解决此问题的最简单方法是将genbank.pm
移至MRS/Scripts/genbank.pm
,将require
更改为require MRS::Scripts::genbank.pm
(或use
;如果您不知道t导出任何内容,它们是等效的),然后将该子调用为MRS::Scripts::genbank::new
或MRS::Scripts::genbank->new
。这种方法将使文件名和包名彼此同步,这将使以后必须维护代码的人更容易生活(可能是你......)。