Retornar una Subrutina

En el siguiente ejemplo la subrutina tutu recibe un número y retorna una subrutina que multiplica su argumento por dicho número. El programa principal aplica crea varias subrutinas y las aplica a una secuencia de números especificados:

lhp@nereida:~/Lperl/src$ closure3.pl 3 1 2 3 4
Multiplicar por 3: (3 6 9 12)
Multiplicar por -1: (-1 -2 -3 -4)

La subrutina creada dinámicamente recuerda el valor de la variable léxica $n en el momento de su creación.

El bucle de la línea 19 crea diferentes clausuras $t que acceden a diferentes instancias de la variable léxica $n.

lhp@nereida:~/Lperl/src$ cat -n closure3.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Scalar::Util qw(looks_like_number);
 4
 5  sub tutu {
 6    my $n = shift;
 7
 8    sub {
 9      my $x = shift; die "Se esperaba un numero\n" unless looks_like_number($n);
10      return $x*$n;
11    }
12  }
13
14  ########### main #################################
15  die "Uso:\n$0 num1 num2 num3 ...\n" unless (@ARGV > 1);
16  my $n = shift; die "Se esperaba un numero\n" unless looks_like_number($n);
17
18
19  for my $f ($n, -1) {
20    my $t = tutu($f);
21    my @a = map { $t->($_) } @ARGV;
22    print "Multiplicar por $f: (@a)\n";
23  }

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19