由于标量@list,Perl BEGIN编译失败

时间:2016-04-05 02:53:02

标签: perl

我是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;,则可以。但是当他们在一起时,他们错了。为什么呢?

2 个答案:

答案 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块有自己的编译阶段。

因为useBEGIN块的其余部分之前执行,所以你写的相当于

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 );
}

似乎工作正常。