Возвращаемое значение из 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 не возвращает 25 непосредственно из foreach (точно так же, как if)? Я добавил дополнительный $sum как:

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

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

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

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

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

Ответ 1

От perlsub:

Если возврат не найдено, и если последнее выражение является выражением, его значение возвращается. Если последний оператор представляет собой структуру управления циклом как foreach или некоторое время, возвращаемое значение не указано.