如何在perl中返回长度为0的空数组/数组?
我想返回一个空数组,而不是一个空列表 我有一个sub,它返回一个数组。我希望能够用它做到这一点:如何在perl中返回长度为0的空数组/数组?,perl,Perl,我想返回一个空数组,而不是一个空列表 我有一个sub,它返回一个数组。我希望能够用它做到这一点: my $count = scalar getArray(); 我是这样做的: sub getArray { if ( !isGood() ) { return (); } else { my @array = calculateSomehow(); return @array; } } my $count = scalar g
my $count = scalar getArray();
我是这样做的:
sub getArray {
if ( !isGood() ) {
return ();
} else {
my @array = calculateSomehow();
return @array;
}
}
my $count = scalar getArray();
当我看到时,我大吃一惊!isGood()
和$count
变为undef
,而不是0
!阅读后,我意识到这是因为getArray()是在标量上下文中计算的,因此列表()
是作为标量计算的,而标量(())
是undef
,而my@array;标量(@array)
为0
现在的问题是:如何最优雅地返回空数组,以便$count
是0
如果!isGood()
?我只想到:
# This is kind of kludgy: Dereference an anonymous array ref. Really?
return @{[]};
或
返回长度为0的数组(空数组)或使
scalar getArray()
求值为0
?在这两种情况下,如果只返回一个数组,可能最清楚:
sub getArray {
my @array;
@array = calculateSomehow() if isGood();
return @array;
}
但要以最小的方式修改原始代码,请使用wantarray
if (!isGood()) {
return wantarray ? () : 0;
}
返回一个引用,通过取消引用,您可以在一次调用中获得数组大小(如果为空,则为0)
sub getArray {
# calculate ...
return [ @results ]; # @results may be empty
}
$rres = getArray();
my $count = @$rres; # gives 0 if ref is to empty array
my $cnt = @{ getArray() }; # or without storing the return
如果愿意,可以使用上面的标量,但不需要。这也类似于返回指向数组的指针(即使是空的),如果这是您通过要求“空数组”而想到的
如果您想走这条路线,但要挑出不好的
sub getArray {
return if !isGood(); # returns undef
# calculate ...
return [ @results ]; # scalar whether the list be empty or not
}
使用context
可能会有所帮助——您可以获取数组(空列表或非空列表),或者获取标量的0
sub getArray {
if (!isGood() ) {
return (wantarray) ? () : 0;
}
else { } # your code
}
my @results = getArray() # returns a list, possibly empty
my $count = getArray(); # returns 0
你觉得我的@empty
更干净还是更优雅?谢谢@choroba-是的,我觉得!SUB总是返回列表。正如@ysth正确观察到的,您不能从子例程返回数组,只能返回列表。数组的计算结果为列表上下文中的列表和标量上下文中的标量。谢谢,@tchrist。如果你把这个作为一个答案,我会接受的。这就解释了到底发生了什么。对不起,zdim,@Sean抢先了你一步!;-)@彼得·莫奇,我看到了。。。到了17秒?结果是,通过他需要的(简单的)纠正。。。他没有我的。。。如果
有未定义的行为。@choroba如果是真的,那会让我大吃一惊。请提供参考。:注意:my、state或our modified with语句修饰符条件或循环构造(例如,my$x if…
)的行为未定义。my变量的值可能是未定义的、任何先前指定的值,或者可能是任何其他值。不要依赖它。未来版本的perl可能会做一些与您试用的perl版本不同的事情。这里有龙,嗯。似乎我在很多地方都见过这样的代码,这里的语义似乎很明确。但是修复起来很容易。my
既有编译时效果(从下面的语句到块的末尾(或在另一个声明之后的语句)提到变量名绑定到该词法),也有运行时效果(将要清除的值和退出封闭范围时不可用的变量安排为有条件)。将其设置为有条件会抑制运行时效果,有时会产生令人惊讶的后果。但这是一个实现细节,可能会发生更改,因此会在文档中发出警告。
sub getArray {
if (!isGood() ) {
return (wantarray) ? () : 0;
}
else { } # your code
}
my @results = getArray() # returns a list, possibly empty
my $count = getArray(); # returns 0