为什么Perl modulino中的'package'关键字会破坏测试?

Ric*_*hlv 2 testing perl modulino

假设有一个简单的Perl脚本testme.pl,就像这样:

use strict;
use warnings;

sub testme {
        return 1;
}

1;
Run Code Online (Sandbox Code Playgroud)

和测试文件testme.t这样:

use strict;
use warnings;

use Test::More;
require_ok('testing.pl');
ok(testme());
done_testing();
Run Code Online (Sandbox Code Playgroud)

运行perl testme.t似乎按预期工作,但http://www.perlmonks.org/bare/?node_id=537361/sf/answers/639423711/建议添加包行,所以我修改了原始剧本:

use strict;
use warnings;
package My::Testing;

sub testme {
        return 1;
}

1;
Run Code Online (Sandbox Code Playgroud)

现在测试失败了:

Undefined subroutine &main::testme called at testing.t
Run Code Online (Sandbox Code Playgroud)

为什么这样?

Dav*_*man 7

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

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

(你也可以use ExporterMy::Testing包中导出sub,然后import从你的测试脚本中导出它作为将sub复制到测试脚本命名空间的一种方式.或者你可以将另一个package My::Testing命令放入测试脚本中,这样它就会在My::Testing默认情况下命名空间.但是引用它My::Testing::testme()是最简单的修复方法,最清楚地说明了你得到的错误信息背后的原因.)