簡體   English   中英

如何在 perl 中返回一個空數組/長度為 0 的數組?

[英]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()$count0 我只是想出了:

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM