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) = 9Obsérvese que hemos omitido la opción
-w del intérprete
y hemos usado el módulo warnings.
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
