2011-09-02 65 views
10

考慮下面的簡單示例:從的foreach在子程序返回值

#!perl -w 
use strict; 

sub max { 
    my ($a, $b) = @_; 
    if ($a > $b) { $a } 
    else { $b } 
} 

sub total { 
    my $sum = 0; 
    foreach (@_) { 
     $sum += $_; 
    } 
    # $sum; # commented intentionally 
} 

print max(1, 5) . "\n"; # returns 5 
print total(qw{ 1 3 5 7 9 }) . "\n"; 

根據Learning Perl(第66頁):

「最後計算的表達式」的真正含義的最後一個表達式該 Perl評估,而不是子例程中的最後一條語句。

有人能解釋我爲什麼total不直接從foreach(就像if)返回25?我增加了額外的$sum爲:

foreach (@_) { 
    $sum += $_; 
    $sum; 
} 

,我有這樣的警告信息:

無用的使用在無效的情況下私​​有變量的...

但是明確使用return作品如預期的那樣:

foreach (@_) { 
    return $sum += $_; # returns 1 
} 

回答

15

perlsub

如果沒有返回被發現,如果最後的語句是一個表達式,則返回其 價值。如果最後一條語句像循環控制結構 像foreach或while一樣,則返回的值是未指定的。

+0

我現在明白了。感謝澄清這一點。 –

+2

@Grzegorz BTW,[PBP](http://refcards.com/docs/vromansj/perl-best-practices/refguide.pdf)建議始終通過顯式的'return'返回。 –

+0

我認爲更多的是「Perlish」來省略可選的'return',但我同意這個提示,因爲顯式樣式對於程序員來說通常更加顯眼。感謝PBP。 –