Una de las primeras cosas que intento aprender en un lenguaje de programación desconocido es cómo maneja los cierres. Su semántica a menudo se entrelaza con la forma en que el lenguaje maneja los ámbitos y otras partes difíciles, por lo que su comprensión revela varios otros aspectos del lenguaje. Además, los cierres son una construcción realmente poderosa y muchas veces reducen la cantidad de repetición que tengo que escribir. Así que me estaba metiendo con cierres de Perl y me encontré con un poco de Gotcha:
my @closures;
foreach (1..3) {
# create some closures
push @closures, sub { say "I will remember $_"; };
}
foreach (@closures) {
# call the closures to see what they remember
# the result is not obvious
&{$_}();
}
Cuando escribí el código anterior que estaba esperando para ver
I will remember 1
I will remember 2
I will remember 3
pero en cambio me dieron I will remember CODE(0x986c1f0)
.
El experimento anterior reveló que $_
es muy dependiente del contexto y si aparece en un cierre, entonces su valor no se fija en el momento de la creación del cierre. Se comporta más como una referencia. ¿Qué otras trampas debo tener en cuenta al crear cierres en Perl?
Pero esto es prácticamente lo mismo que usar 'foreach my $ num ...'. – davidk01
Entonces, si solo cierran sobre variables léxicas, ¿qué ocurre con otros tipos de variables? ¿Utiliza el cierre el valor disponible durante el sitio de llamada como lo hace para '$ _'? – davidk01
@ davidk01: como en cualquier otro lenguaje de programación que permita variables globales, los cierres realmente se cierran sobre esa variable como normal. Acaba de olvidar que es global y, por lo tanto, puede cambiar cuando otro código establece su valor en otra cosa (como por el propio sub anónimo cuando se llama). – slebetman