为什么 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 ) { ... }
为什么这段代码不打印“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 ) { ... }