2012-02-20 12 views
8

Ho alcuni script che ho iniziato con l'unit test utilizzando l'idea del "modulino". Ho riscontrato un problema in quanto quando lo script viene chiamato con "perl -d" lo script non viene eseguito poiché caller() restituisce un valore true.Edizione Perl -d e modulino

Ho il corpo principale dello script racchiuso in un main() e alcune subroutine vengono lentamente estratte da main() nelle proprie subroutine.

Nella parte superiore dello script che ho:

main(@ARGS) unless caller(); 

Quando viene chiamato in .T test funziona come voglio, non in esecuzione main() in modo da poter testare le subroutine. Quando chiamo lo script da CLI funziona great calling().

Il problema si verifica quando lo chiamo io dalla CLI con:

perl -d myscript.pl 

In questa fase chiamante restituisce un valore valido (anziché undef) e principale non viene chiamato.

I suggerimenti sarebbero molto apprezzati su come affrontare questo.

+2

Buona cattura. Non lo considererei mai visto che non uso quasi mai il debugger perl. Grazie, :) –

+0

Non riesco a riprodurre questo comportamento. Ho scritto un piccolo modulino e il debugger funziona ancora bene. Puoi pubblicare un esempio? – cjm

+0

Ci dovrebbe essere '@ ARGV' invece di' @ ARGS'. Nel caso in cui qualcuno fosse solo copia-incolla :) – famousgarkin

risposta

8

La situazione con lo switch -d è simile a quella del test: il codice viene eseguito da qualcos'altro, in questo caso il debugger.

È possibile eseguire autonomamente lo main chiamandolo nel debugger manualmente oppure è necessario rilevare se caller è un debugger. Qualcosa di simile:

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

La tua condizione è sbagliata. Se 'caller' è vero, la seconda condizione non viene mai valutata. Prova 'a meno che il chiamante e (chiamante) [0] ne 'DB'. – cjm

+2

@cjm - grazie, risolto. Ho trasformato le condizioni in positivo, perché mi ci è voluto un po 'di tempo per capirlo. – bvr

+0

Questo sembra buono. Ci proverò e pubblicherò i miei risultati. Grazie! – LanceW