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