2011-09-02 12 views
10

Considere siguiente ejemplo sencillo:Volviendo valor de foreach en subrutinas

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

Según Learning Perl (página 66):

“La última expresión evaluada” significa en realidad la última expresión que Perl evalúa, en lugar de la última declaración en la subrutina.

Puede alguien explicar por qué no vuelve total25 directamente de foreach (al igual que if)? Yo añadido adicional $sum como:

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

y tengo tal mensaje de advertencia:

uso inútil de la variable privada en el marco vacío en ...

uso explícito de return Sin embargo las obras como se esperaba:

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

Respuesta

15

De perlsub:

Si no se encuentra ninguna devolución y si la última afirmación es una expresión, se devuelve su valor . Si la última instrucción es una estructura de control de bucle como un foreach o un rato, el valor devuelto no se especifica.

+0

Entiendo ahora. Gracias por aclarar esto. –

+2

@Grzegorz BTW, [PBP] (http://refcards.com/docs/vromansj/perl-best-practices/refguide.pdf) recomienda regresar siempre a través de un 'return' explícito. –

+0

Pensé que es más "Perlish" para omitir el 'retorno' opcional, pero estoy de acuerdo con ese consejo, porque el estilo explícito generalmente es más conspicuo para el programador. Gracias por PBP. –

Cuestiones relacionadas