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
2009-10-04