next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Currying Sup: Clausuras Ant: Anidamiento de subrutinas Err: Si hallas una errata ...

Clausuras e Iteradores

El siguiente ejemplo muestra una subrutina que retorna una referencia a una clausura, la cual puede usarse para saltar a través de un array con un paso fijo:
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";
  }
}

Ejercicio 5.16.1   La funció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


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