Anidamiento de subrutinas

Ya vimos en la sección 1.15.1 que Perl no anida subrutinas como ocurre en Pascal. Sin embargo, el uso combinado de clausuras, typeglobs y local permite emular el efecto:
lhp@nereida:~/Lperl/src$ cat -n nestedsub.pl
 1  #!/usr/bin/perl
 2  use strict;
 3  use warnings;
 4
 5  sub interior {
 6    my $x = shift;
 7    print "sub marine: $x\n";
 8    $x*$x;
 9  }
10
11  sub exterior {
12    my $x = $_[0] + 3;
13    no strict 'refs';
14    no warnings;
15    local *interior = sub { print "interior anidada: $x\n"; return $x - 1 };
16    return $x + interior();
17  }
18
19  print 'exterior(2) = ',exterior(2),"\n";
20  print 'interior(3) = ',interior(3),"\n"
En este ejemplo se ha creado en la lınea 15 una subrutina denominada interior que ensombrece a la subrutina interior global definida en la lınea 5 y que además tiene acceso al ámbito de exterior. Esta subrutina interior de la lınea 15 es accesible solamente desde la subrutina exterior. El resultado de la ejecución es:
lhp@nereida:~/Lperl/src$ ./nestedsub.pl
interior anidada: 5
exterior(2) = 9
sub marine: 3
interior(3) = 9
Obsérvese que hemos omitido la opción -w del intérprete y hemos usado el módulo warnings.

Ejercicio 4.18.1   ¿Cuál es el ámbito exacto de visibilidad de una subrutina contruida como la subrutina interior de la lınea 15? ¿Serıa visible desde una subrutina que fuera llamada desde exterior en un punto posterior a su creación?

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