为什么 Perl 在布尔上下文中将具有单个 undef 值的数组评估为 true?

Why does Perl evaluate an array with a single undef value as true in boolean context?

为什么这段代码不打印“2”?

#!/usr/bin/perl

sub get_undef() {
        return undef;
}

my $test1 = get_undef;
my @test2 = get_undef;

print "1\n" unless ($test1);
print "2\n" unless (@test2);

数组 @test2 有一个元素:undef。在标量上下文中,此数组不为空,因此计算结果为真。

您的 @test2 数组包含一个值 (undef)。

条件将数组置于标量上下文中,这导致数组的大小 (1)。

如果您希望 $test 未定义且 @test2 为空,您可以 return; 来自您的子。

Perl 允许您拥有一个具有单个值 undef 的列表。它可以与任何其他值一样有意义,尽管您必须决定您希望它在您的上下文中意味着什么。

在标量上下文中,数组的值是该数组中元素的数量。请注意,这与“在标量上下文中列出”的想法不同,后者不是一件事。数组是一个容器,其中包含一个列表并具有自己的行为。例如,您可以 shift 一个数组,但不能是一个列表。

如果你想检查一个数组是否至少有一个定义的值,你可以使用 grep:

if( grep { defined } @array ) { ... }