从子例程中的foreach返回值

时间:2011-09-02 13:07:06

标签: perl function return-value

请考虑以下简单示例:

#!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没有直接从25返回foreach(就像if一样)吗?我添加了额外的$sum作为:

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

我有这样的警告信息:

  

在void上下文中无用的私有变量......

然而,return的明确使用按预期工作:

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

1 个答案:

答案 0 :(得分:15)

来自perlsub

  

如果没有找到返回,并且最后一个语句是表达式,则为   返回值。如果最后一个语句是循环控制结构   像foreach或者while,返回的值是未指定的。