respuesta de
Eric Strom es correcta, y probablemente lo quería ver, pero no entra en los detalles de la encuadernación.
Una breve nota sobre la vida útil léxica: lexicals se crean en tiempo de compilación y están realmente disponibles, incluso antes de entrar en su ámbito, como muestra este ejemplo:
my $i;
BEGIN { $i = 42 }
print $i;
A partir de entonces, cuando salen del ámbito de aplicación, se deje de estar disponible hasta la próxima vez que están en su alcance:
print i();
{
my $i;
BEGIN { $i = 42 }
# in the scope of `my $i`, but doesn't actually
# refer to $i, so not a closure over it:
sub i { eval '$i' }
}
print i();
en su código, el cierre se une a la inicial léxica $i
en tiempo de compilación. Sin embargo, los bucles foreach son un poco extraños; mientras que el my $i
realmente crea un léxico, el bucle foreach no lo usa; en su lugar, lo alude a uno de los valores en bucle en cada iteración y luego lo restaura a su estado original después del bucle. Por lo tanto, su cierre es lo único que hace referencia al léxico original $i
.
Una ligera variación muestra más complejidad:
foreach (@foo) {
my $i = $_;
sub printer {
my $blah = shift @_;
print "$blah-$i\n";
}
printer("test");
}
Aquí, el original $i
se crea en tiempo de compilación y el cierre se une a ese; la primera iteración del ciclo lo establece, pero la segunda iteración del ciclo crea un nuevo $i
no asociado con el cierre.
muy interesante, gracias – Snark