2011-09-02 16 views
10

Rozważmy następujący prosty przykład:Zwracanie wartości z foreach w podprogramów

#!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"; 

Według Learning Perl (strona 66):

„Ostatni ocenia wyrażenie” naprawdę oznacza, że ​​ostatnie wyrażenie że Perl ocenia, zamiast ostatniego stwierdzenia w podprogramie.

Czy ktoś może mi wyjaśnić dlaczego total nie zwraca 25 bezpośrednio od foreach (podobnie jak if)? Dodałem dodatkowy $sum jak:

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

i mam taki komunikat ostrzegawczy:

Useless wykorzystanie prywatnej zmiennej w kontekście nieważne co ...

jednak wyraźne zastosowanie return prac zgodnie z oczekiwaniami:

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

Odpowiedz

15

Od perlsub:

Jeśli nie ma powrotu występuje i jeśli ostatnie stwierdzenie jest wyrazem jego wartość jest zwracana. Jeśli ostatnia instrukcja jest strukturą sterowania pętlą , podobnie jak foreach lub chwilę, zwrócona wartość jest nieokreślona.

+0

Teraz rozumiem. Dziękuję za wyjaśnienie tego. –

+2

@Grzegorz BTW, [PBP] (http://refcards.com/docs/vromansj/perl-best-practices/refguide.pdf) zaleca, aby zawsze zwracać poprzez jawne 'return'. –

+0

Myślałem, że to bardziej "Perlish", aby pominąć opcjonalny 'return', ale zgadzam się z tą wskazówką, ponieważ styl jawny jest ogólnie bardziej widoczny dla programisty. Dzięki za PBP. –

Powiązane problemy