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