假设有一个简单的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=537361https://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/

10-11 17:21