[英]How do I return an empty array / array of length 0 in perl?
我想返回一個空數組,而不是一個空列表。
我有一個返回一系列事物的子程序。 我希望能夠做到這一點:
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() 是在標量上下文中評估的,因此list ()
被評估為標量,而scalar( () )
是undef
,而my @array; scalar( @array )
my @array; scalar( @array )
為 0。
現在的問題變成了:我如何最優雅地返回一個空數組,如果!isGood()
則$count
為0
? 我只是想出了:
# This is kind of kludgy: Dereference an anonymous array ref. Really?
return @{[]};
或者
# I use a temporary variable for this. Really?
my @empty;
return @empty;
沒有任何更簡潔/更優雅的方法可以返回長度為 0 的數組(空數組)或其他使scalar getArray()
評估為0
的方法嗎?
如果在這兩種情況下都返回一個數組,這可能是最清楚的:
sub getArray {
my @array;
@array = calculateSomehow() if isGood();
return @array;
}
但是要以最小的方式修改您的原始代碼,請使用wantarray
。
if (!isGood()) {
return wantarray ? () : 0;
}
Perl 中的子例程只能返回一個(標量)列表。
如果給定數組變量以return
它,則計算它的元素列表,如果在列表上下文中調用 sub,或者如果在標量上下文中調用 sub,則返回它的長度(元素數)。 (最初在評論中說明,僅在此編輯中進行了總結。)
最接近“返回數組”的是返回對它的引用。
返回一個引用,您可以通過取消引用在一次調用中獲取數組大小(如果為空,則為 0)。
sub getArray {
# calculate ...
return \@results; # @results may be empty ( or [@results] )
}
$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
}
使用上下文可能會有所幫助——要么從數組中獲取列表(空或非空),要么為標量獲取0
sub getArray {
if (!isGood() ) {
return (wantarray) ? () : 0;
}
else { } # your code
}
my @results = getArray() # returns a list, possibly empty
my $count = getArray(); # returns 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.