2012-02-20 7 views
8

Tengo algunos scripts que he comenzado a probar con la idea "modulino". Me he encontrado con un problema cuando el script se llama con "perl -d" y el script no se ejecuta, ya que caller() devuelve un valor verdadero.Perl -d y problema de modulino

Tengo el cuerpo principal de la secuencia de comandos envuelto en una main() y algunas subrutinas se extraen lentamente de la main() en sus propias subrutinas.

En la parte superior de la secuencia de comandos que tengo:

main(@ARGS) unless caller(); 

Cuando llama en .t pruebas funciona como yo quiero, no corriendo main() para que pueda probar las subrutinas. Cuando llamo al script desde CLI, funciona muy bien llamando a main().

El problema se produce cuando la llamo desde la CLI con:

perl -d myscript.pl 

En esta etapa la persona que llama devuelve un valor válido (en lugar de UNDEF) y el principal no se llama.

Sugerencias sería muy apreciado acerca de cómo acercarse a este.

+2

Buena captura. Nunca lo consideraría, ya que casi nunca uso el depurador Perl. Gracias, :) –

+0

Parece que no puedo reproducir este comportamiento. Escribí un pequeño modulino, y el depurador todavía funciona bien. Puede publicar un ejemplo? – cjm

+0

Debe haber '@ ARGV' en lugar de' @ ARGS'. En caso de que alguien solo haya copiado y pegado :) – famousgarkin

Respuesta

8

La situación con el interruptor -d es similar a la de las pruebas: su código es ejecutado por otra cosa, en este caso, el depurador.

Puede ejecutar main usted mismo llamándolo en el depurador manualmente o tiene que detectar si caller es depurador. Algo como:

main(@ARGS) if !caller() || (caller)[0] eq 'DB'; 
+2

Su condición es incorrecta. Si 'calller' es verdadero, entonces la segunda condición nunca se evalúa. Intenta 'a menos que llames y (llama) [0] ne 'DB''. – cjm

+2

@cjm - gracias, arreglado. Cambié la condición a positiva ya que me tomó bastante tiempo resolverlo. – bvr

+0

Esto se ve bien. Probaré esto y publicaré mis resultados. ¡Gracias! – LanceW

Cuestiones relacionadas