peer
definida en la línea 22
llama a la subrutina interior
. ¿Podría identificar
que subrutina es llamada? ¿La de la línea 5 o la de la
línea 14?
lhp@nereida:~/Lperl/src$ cat -n localsub.pl 1 #!/usr/bin/perl 2 use strict; 3 use warnings; 4 5 sub interior { 6 my $x = shift; 7 print "En sub 'interior global': $x\n"; 8 } 9 10 sub exterior { 11 my $x = $_[0]; 12 no strict 'refs'; 13 no warnings; 14 local *interior = sub { 15 print "En sub interior anidada\n"; 16 return shift() - 1 17 }; 18 print "En sub exterior. Llamo a la sub 'peer(5)'\n"; 19 peer(5); 20 } 21 22 sub peer { 23 print "En sub peer. Llamo a 'interior'\n"; 24 interior(shift())."\n"; 25 } 26 27 exterior(2); 28 interior(3);Al ejecutar el programa
localsub.pl
se produce la siguiente salida:
lhp@nereida:~/Lperl/src$ localsub.pl En sub exterior. Llamo a la sub 'peer(5)' En sub peer. Llamo a 'interior' En sub interior anidada En sub 'interior global': 3
lhp@nereida:~/Lperl/src$ cat -n ./privatesub.pl 1 #!/usr/bin/perl 2 use strict; 3 use warnings; 4 5 package One; 6 sub tutu { 7 my $x = shift; 8 print "En sub 'One:tutu ': $x\n"; 9 } 10 11 package Two; 12 sub tutu { 13 my $package = caller; 14 die "Attempt to call private function Two:tutu" 15 unless ($package eq __PACKAGE__); 16 17 my $x = shift; 18 print "En sub 'Two:tutu ': $x\n"; 19 } 20 21 package main; 22 One::tutu(3); 23 Two::tutu(5);
Casiano Rodríguez León