假设有一个简单的Perl脚本testme.pl像这样:
use strict;
use warnings;
sub testme {
return 1;
}
1;
像这样的测试文件testme.t:
use strict;
use warnings;
use Test::More;
require_ok('testing.pl');
ok(testme());
done_testing();
运行
perl testme.t
似乎可以按预期工作,但是http://www.perlmonks.org/bare/?node_id=537361和https://stackoverflow.com/a/9134624/272387都建议添加一个打包行,因此我将原始脚本修改为:use strict;
use warnings;
package My::Testing;
sub testme {
return 1;
}
1;
现在测试失败并显示:
Undefined subroutine &main::testme called at testing.t
为什么这样?
最佳答案
之所以失败,是因为您的testme
子不再位于默认的main
命名空间中,而现在位于My::Testing
命名空间(程序包)中。现在,您需要使用其全名My::Testing::testme()
对其进行访问。
由于main
中的标识符是默认的,因此不需要显式指定其软件包,这就是为什么错误消息将其称为main::testme
的原因。
(您也可以在use Exporter
包中My::Testing
,导出子文件,然后从测试脚本中导出import
,作为将子文件复制到测试脚本名称空间中的一种方式。或者您可以放置另一个package My::Testing
命令放入测试脚本中,以便默认情况下它会出现在My::Testing
命名空间中。但是将其引用为My::Testing::testme()
是修复它的最简单方法,并且最清楚地说明了收到的错误消息的原因。)
关于perl - 为什么在Perl modulino中断测试中使用“package”关键字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33074449/