2

假设有一个简单的 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

为什么这样?

4

1 回答 1

7

它失败了,因为您的testmesub 不再位于默认main命名空间中,它现在位于My::Testing命名空间(包)中。您现在需要通过它的全名来访问它,My::Testing::testme().

中的标识符main不需要明确指定其包,因为它是默认值,但这就是错误消息将其称为main::testme.

(您也可以use ExporterMy::Testing包中导出 sub,然后将import其从测试脚本中复制到测试脚本的命名空间中。或者您可以将另一个package My::Testing命令放入测试脚本中,以便它在My::Testing默认情况下命名空间。但是引用它My::Testing::testme()是修复它的最简单方法,并且最清楚地说明了您收到的错误消息背后的原因。)

于 2015-10-12T07:44:36.707 回答