为什么 Perl modulino 中的 'package' 关键字会中断测试?
Why does 'package' keyword in Perl modulino break tests?
假设有一个简单的 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 and 都建议加包行,所以我修改原脚本为:
use strict;
use warnings;
package My::Testing;
sub testme {
return 1;
}
1;
现在测试失败了:
Undefined subroutine &main::testme called at testing.t
为什么会这样?
它失败了,因为你的 testme
sub 不再在默认的 main
命名空间中,它现在在 My::Testing
命名空间(包)中。您现在需要通过其全名 My::Testing::testme()
.
来访问它
main
中的标识符不需要显式指定它们的包,因为它是默认设置,但这就是错误消息将其称为 main::testme
.
的原因
(您也可以 use Exporter
在 My::Testing
包中导出子程序,然后 import
从您的测试脚本中导出子程序,作为将子程序复制到测试脚本的方法命名空间。或者您可以将另一个 package My::Testing
命令放入测试脚本中,这样它将默认在 My::Testing
命名空间中查找。但是将其引用为 My::Testing::testme()
是修复它的最简单方法并且最清楚地说明了您收到的错误消息背后的原因。)
假设有一个简单的 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 and 都建议加包行,所以我修改原脚本为:
use strict;
use warnings;
package My::Testing;
sub testme {
return 1;
}
1;
现在测试失败了:
Undefined subroutine &main::testme called at testing.t
为什么会这样?
它失败了,因为你的 testme
sub 不再在默认的 main
命名空间中,它现在在 My::Testing
命名空间(包)中。您现在需要通过其全名 My::Testing::testme()
.
main
中的标识符不需要显式指定它们的包,因为它是默认设置,但这就是错误消息将其称为 main::testme
.
(您也可以 use Exporter
在 My::Testing
包中导出子程序,然后 import
从您的测试脚本中导出子程序,作为将子程序复制到测试脚本的方法命名空间。或者您可以将另一个 package My::Testing
命令放入测试脚本中,这样它将默认在 My::Testing
命名空间中查找。但是将其引用为 My::Testing::testme()
是修复它的最简单方法并且最清楚地说明了您收到的错误消息背后的原因。)