Variables Léxicas Persistentes

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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19