En el momento de su creación una subrutina - sea anónima o no - toma los valores de las variables del ámbito en el que se encuentra. El ámbito léxico que engloba a la subrutina en el momento de su creación determina una clausura. Un ejemplo:
lhp@nereida:~/Lperl/src$ cat -n closure2.pl 1 #!/usr/bin/perl -w 2 use strict; 3 my $name = 1000; 4 { 5 my $name = $name--; 6 7 sub pr { 8 $name++; 9 return "closure: $name\n"; 10 } 11 } 12 13 print $name,"\n"; 14 print pr(); 15 print pr(); 16 print pr();cuando se ejecuta produce la siguiente salida:
lhp@nereida:~/Lperl/src$ closure2.pl 999 closure: 1001 closure: 1002 closure: 1003
En condiciones normales Perl liberarıa la memoria correspondiente
a la variable name
de la lınea 5 al final de su ámbito.
Sin embargo, la
subrutina pr
que la usa continúa visible y
la variable name
se conserva mientras la rutina
este en uso. La única forma de acceder a la variable
name
de la lınea 5
es a través de la subrutina pr
.
Esta es una de las caracterıstica de una clausura: subrutinas que recuerdan el estado del entorno en el momento de su creación preservando las variables del ámbito léxico que les rodea, incluso después de la desaparición de dicho ámbito léxico.
Casiano Rodríguez León