您没有提供足够的信息来完全确定问题所在,但最可能的原因是new
子组件位于genbank
.
当您尝试调用genbank::new
(or ) 时,Perl会在包中而不是在文件中genbank->new
查找名为 sub 。按照惯例,该文件将包含一个名为 的包,但这纯粹是为了约定和方便。它不是由语言强制执行的,并且文件名和包名之间绝对没有自动连接。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
就是创建 sub 的包。您有两种调用它的选项:
将其称为MRS::Scripts::genbank::new
(或者,如果它实际上是一个对象构造函数,则称为MRS::Scripts::genbank->new
)。如果你想使用包名来调用它,那么你必须使用正确的包名。
从包中导出它MRS::Scripts::genbank
并修改您的调用脚本以从该包中导入符号(通过移动genbank.pm
到MRS/Scripts/genbank.pm
并更改您的require
touse MRS::Scripts::genbank;
或MRS::Scripts::genbank->import;
在之后添加require
),然后将其调用为new()
. 虽然这将在您的问题的有限范围内起作用,但我强烈建议您不要这样做,因为一旦您对另一个包含 a 的模块重复此操作sub new
,它就会全部崩溃,因为不能同时有两个new
s同一个地方。
解决此问题的最简洁方法是移动genbank.pm
到MRS/Scripts/genbank.pm
,将您的更改require
为require MRS::Scripts::genbank.pm
(或use
;如果您不导出任何内容,它们是等效的),然后将 sub 称为MRS::Scripts::genbank::new
or MRS::Scripts::genbank->new
。这种方法将使文件名和包名彼此同步,这将使将来必须维护代码的人(可能是你......)的生活更轻松。