sub hop_along { my ($from, $to, $step) = @_; my $next = $from-$step; # inicializar contador my $closure_ref = sub { $next += $step; return 0 if $next > $to; $_[0] =$next; return 1; }; # Ponemos ; puesto que es una asignación return $closure_ref; }
El generador podria usarse como sigue:
$iterator = hop_along 1, 100, 7; # crear la clausura while ($iterator->($next)) { # llamar a la clausura print $next; }
Observe que la siguiente llamada a hop_along
crea un conjunto nuevo de variables léxicas
y una nueva subrutina anónima. Es posible
simultanear de este modo dos clausuras, cada una con
su propio rango y paso:
$row = hop_along 1, 1024, 1; while ($row->($r)) { $col = hop_along 1, 768, 2; while ($col->($c)) { print "$r, $c\n"; } }
time
devuelve el número de segundos desde
Enero de 1970. Utilizando esta función rellene el
código marcado con ... en el programa que figura a continuación:
timestamp
#!/usr/local/bin/perl5.8.0 -w sub timestamp { my ... return sub { ... }; } $first_exp = timestamp(); sleep(1); $second_exp = timestamp(); sleep(1); $f_end = $first_exp->(); $s_end = $second_exp->(); print "First exp $f_end\n"; print "Second exp $s_end\n";La salida del programa deberá ser algo parecido a:
$ ./closure_time.pl First exp 2 Second exp 1