我想返回一个空的数组,而不是一个空的列表。
我有一个返回一系列事物的子。我希望能够用它做到这一点:
my $count = scalar getArray();
我是这样做的:
sub getArray {
if ( !isGood() ) {
return ();
} else {
my @array = calculateSomehow();
return @array;
}
}
my $count = scalar getArray();
当!isGood()
和$count
成为undef
而不是0
时,我感到很惊讶!阅读perlfaq4之后,我意识到这是因为getArray()在标量上下文中进行了评估,因此列表 ()
被评估为标量,scalar( () )
是undef
,而my @array; scalar( @array )
是0。
现在的问题是:如何最优雅地返回一个空的数组,以便$count
0
!isGood()
如果# This is kind of kludgy: Dereference an anonymous array ref. Really?
return @{[]};
?我只想出:
# I use a temporary variable for this. Really?
my @empty;
return @empty;
或
scalar getArray()
Aren有任何更清洁/更优雅的方式来返回长度为0的数组(空数组)或其他一些方式{{1} }评价为0
?
答案 0 :(得分:6)
如果你只是在两种情况下都返回一个数组,那么它可能是最清楚的:
sub getArray {
my @array;
@array = calculateSomehow() if isGood();
return @array;
}
但要以最小的方式修改原始代码,请使用wantarray
。
if (!isGood()) {
return wantarray ? () : 0;
}
答案 1 :(得分: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
如果您愿意,可以使用scalar
,但您不需要。这也类似于返回一个指向数组的指针(即使是空的),如果这是你想要一个“空数组”的想法。
如果你想走这条路,而是单挑not-good
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