我是Perl的新手。我发现以下代码无法运行:
#! perl -T
use strict;
use warnings;
BEGIN {
my @classes = qw(Animal Cow Sheep Horse Mouse);
use Test::More tests => scalar @classes;
}
如果我将scalar @classes
更改为5
,则可以。如果我将use Test::More tests => scalar @classes;
更改为print scalar @classes;
,则可以。但是当他们在一起时,他们错了。为什么呢?
答案 0 :(得分:7)
执行此操作的惯用方法是使用plan
函数,而不是在use
语句中指定测试数:
use Test::More;
my @classes = qw(Animal Cow Sheep Horse Mouse);
plan(tests => scalar @classes);
如果您坚持在use
中指定测试次数,则需要
my @classes;
BEGIN {
@classes = qw(Animal Cow Sheep Horse Mouse);
}
use Test::More tests => scalar @classes;
或
BEGIN {
my @classes = qw(Animal Cow Sheep Horse Mouse);
require Test::More;
Test::More->import(tests => scalar @classes);
}
问题是在编译时评估use
。您将它放在BEGIN
块中,该块也在编译时进行评估,但BEGIN
块有自己的编译阶段。
因为use
在BEGIN
块的其余部分之前执行,所以你写的相当于
BEGIN {
my @classes;
require Test::More;
Test::More->import(tests => scalar @classes);
@classes = qw(Animal Cow Sheep Horse Mouse)
}
这就是为什么它抱怨你试图计划0次测试。
答案 1 :(得分:2)
这是因为use MODULE
完全等同于BEGIN { require Module; Module->import( LIST ); }
(请参阅perldoc -f use
)。
我怀疑BEGIN块中的BEGIN导致问题,实际上,用
代替代码#! perl -T
use strict;
use warnings;
BEGIN {
my @classes = qw(Animal Cow Sheep Horse Mouse);
require Test::More; Test::More->import( tests => scalar @classes );
}
似乎工作正常。