Возвращая значение от 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"; 

согласно обучению Perl (стр. 66):

«Последнее оцениваемое выражение» действительно означает последнее выражение , что Perl оценивает, а не последнее утверждение в подпрограмме.

Может ли кто-то объяснить мне, почему всего не возвращается 25 непосредственно из Foreach (как , если )? Я добавил дополнительные $ Sum как:

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

, и у меня есть такое предупреждающее сообщение:

бесполезное использование частной переменной в контексте пустота в ...

Однако явное использование возврата работает как ожидалось:

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

10
задан Grzegorz Szpetkowski 2 September 2011 в 13:12
поделиться