2011-09-02 62 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。 –