我是 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;
,就可以了。但当他们在一起时,他们就错了。为什么?
最佳答案
执行此操作的惯用方法是使用 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
block 中,该 block 也在编译时进行评估,但 BEGIN
block 有自己的编译阶段。
因为 use
在 BEGIN
block 的其余部分之前执行,所以你写的内容相当于
BEGIN {
my @classes;
require Test::More;
Test::More->import(tests => scalar @classes);
@classes = qw(Animal Cow Sheep Horse Mouse)
}
这就是为什么它提示你试图计划 0 次测试。
关于Perl BEGIN 编译失败,因为标量 @list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36416306/