Возвращение значения из foreach в подпрограммах - PullRequest
10 голосов
/ 02 сентября 2011

Рассмотрим следующий простой пример:

#!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 оценивает, а не последний оператор в подпрограмме.

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

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

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

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

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

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

1 Ответ

15 голосов
/ 02 сентября 2011

С perlsub :

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

...