next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Clausuras e Iteradores Sup: Clausuras Ant: Clausuras y Generación de Err: Si hallas una errata ...

Anidamiento de subrutinas

Ya vimos en la sección 1.9.1 que Perl no anida subrutinas como ocurre en Pascal. Sin embargo, el uso combinado de clausuras, typeglobs y local permite emular el efecto:
$ cat -n nestedsub.pl
 1  #!/usr/local/bin/perl5.8.0 -w
 2
 3  sub interior {
 4    my $x = shift;
 5    print "sub marine: $x\n";
 6    $x*$x;
 7  }
 8
 9  sub exterior {
10    my $x = $_[0] + 3;
11    local *interior = sub { print "interior anidada: $x\n"; return $x - 1 };
12    return $x + interior();
13  }
14
15
16  print 'exterior(2) = ',exterior(2),"\n";
17  print 'interior(3) = ',interior(3),"\n";
En este ejemplo se ha creado en la línea 11 una subrutina denominada interior que ensombrece a la subrutina interior global definida en la línea 3 y que además tiene acceso al ámbito de exterior. Esta subrutina interior de la línea 11 es accesible solamente desde la subrutina exterior. El resultado de la ejecución es:
$ ./nestedsub.pl
Subroutine main::interior redefined at ./nestedsub.pl line 11.
interior anidada: 5
exterior(2) = 9
sub marine: 3
interior(3) = 9


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Clausuras e Iteradores Sup: Clausuras Ant: Clausuras y Generación de Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21