[Madrid-pm] Optimizando el valor de vuelta de una subrutina

Joaquín Ferrero explorer en joaquinferrero.com
Dom Mayo 27 17:07:21 PDT 2012


El 27/05/12 15:13, JJ Merelo escribió:
> Hola Pregunta corta: ¿Cómo se hace para que Perl no devuelva un valor
> de una subrutina?

> Pregunta larga: en el MasterMind hay subrutinas que
> se llaman millones (o miles de millones) de veces. El profiler dice
> que, curiosamente, el devolver el valor de la misma es el cuello de
> botella. Igual hay otra forma de solucionarlo, como meterlas inline
> (la verdad, no sé como hacerlo) pero lo que he hecho ha sido declarar
> el prototipo como que devuelvan void y hacer que se les pase el
> hashref de vuelta como parámetro. Marginalmente mejora algo, pero
> sigue devolviendo el valor devuelto por la última función en la
> subrutina (un map). Añadir return; no mejora prácticamente nada, y
> declararla como void con prototipo tampoco. ¿Alguna idea?
>
>
Según perlsub, no se puede: una subrutina siempre devolverá un valor,
incluso aunque no pongamos un return. En ese caso, será el valor de
la última instrucción ejecutada.

Además, depende de en qué contexto se ejecute la subrutina, ese valor
será convertido a escalar o lista. Y si no devolvemos ningún valor, aún
así se creará una lista vacía (en contexto lista), el valor indefinido
(en contexto escalar) o "nada" si está en contexto void.

(¡Oops! ¿Nada?)

JF^D


Más información sobre la lista de distribución Madrid-pm