Perl BEGIN 编译失败,因为标量 @list

标签 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;,就可以了。但当他们在一起时,他们就错了。为什么?

最佳答案

执行此操作的惯用方法是使用 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 有自己的编译阶段。

因为 useBEGIN 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/

相关文章:

perl - 可移植草莓 perl

java - java中的内存文件zip

perl - 如何在 Perl 中列出给定对象或包的可用方法?

regex - 如何将 perl 正则表达式替换编写为表达式中的函数?

perl - 如何使用 LWP::UserAgent 接受 gzip 压缩的内容?

perl - 如何在 SOAP::Lite 中处理命名空间生成?

linux - 需要删除特定 block

perl - Log4Perl 将多个程序的日志记录捆绑到一个日志中

perl - 为什么使用 Perl Here-Document 时会出现语法错误?

perl - 我应该为 Perl GUI 使用 Perl/Tk、Tcl::Tk 还是 Tkx?