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
