Para fines de aprendizaje, estoy jugando con la idea de crear programas controlados por eventos en Perl y noté que podría ser bueno si una subrutina registrada como un controlador de eventos pudiera, en caso de error, programar otra llamada a sí mismo para un momento posterior. Hasta el momento, no tengo llegar a algo como esto:En Perl, ¿cómo puede una subrutina obtener un coderef que apunta a sí mismo?
my $cb;
my $try = 3;
$cb = sub {
my $rc = do_stuff();
if (!$rc && --$try) {
schedule_event($cb, 10); # schedule $cb to be called in 10 seconds
} else {
do_other_stuff;
}
};
schedule_event($cb, 0); # schedule initial call to $cb to be performed ASAP
¿Hay alguna manera de que el código dentro de la sub pueden acceder a la coderef a la sub por lo que podía hacer sin necesidad de utilizar una variable adicional? Me gustaría programar la llamada inicial de esta manera.
schedule_event(sub { ... }, 0);
por primera idea de utilizar caller(0)[3]
, pero esto sólo me da un nombre función, (si no hay nombre), no una referencia de código que tiene una almohadilla que se le atribuye.
Pregunta realmente genial. –
Si está haciendo esto mucho en la misma ejecución del programa, tendrá una pérdida de memoria debido a la referencia circular. Puede usar Scalar :: Util :: weaken() para evitar esto, o usar Sub :: Current o el Y-combinator como se sugiere a continuación. Ver http://use.perl.org/~Aristotle/journal/30896 para una discusión. Si este código no está en un entorno persistente, es probable que su código anterior sea correcto. – runrig
runrig: Gracias por el enlace. Mi cabeza está girando ahora. :-) Tal vez voy a aprender algo ... – hillu