2012-06-22 11 views
5

Ho uno script Perl che richiede l'input dell'utente e crea un altro script che verrà eseguito in un secondo momento. Attualmente sto esaminando e scrivendo test per questi script e uno dei test che vorrei eseguire è verificare se lo script generato viene compilato correttamente (ad esempio perl -c <script>.) Esiste un modo per consentire a Perl di eseguire una compilazione sul script generato senza dover generare un altro processo Perl? Ho provato a cercare le risposte, ma le ricerche mostrano semplicemente informazioni sulla compilazione degli script Perl in programmi eseguibili.Come posso compilare uno script Perl all'interno di una sessione Perl in esecuzione?

+0

Cosa intendi per "compilare" esattamente? Controlla gli errori? O eseguirlo? –

+0

@ user1215106 Controlla gli errori, non eseguirlo. Voglio assicurarmi che lo script non fallisca a causa di errori di sintassi quando viene eseguito più tardi. – Joel

+0

Il codice viene creato dinamicamente nello script? –

risposta

3

per eseguire il codice generato dinamicamente, utilizzare la funzione eval:

my $script = join /\n/, <main::DATA>; 
eval($script); # 3 

__DATA__ 

my $a = 1; 
my $b = 2; 
print $a+$b, "\n"; 

Tuttavia, se si desidera compilare solo o controllare la sintassi, quindi non sarà in grado di farlo entro stessa sessione di Perl.

Funzione syntax_ok dalla libreria Test::Strict eseguire un controllo di sintassi eseguendo perl -c con un interprete perl esterno, quindi presumo che non vi è alcun modo interno.

Solo work-around che può funzionare per voi sarebbe:

my $script = join /\n/, <main::DATA>; 
eval('return;' . $script); 
warn [email protected] if [email protected]; # syntax error at (eval 1) line 3, near "1 
       # my " 

__DATA__ 

my $a = 1 
my $b = 2; 
print $a+$b, "\n"; 

In questo caso, si sarà in grado di verificare la presenza di errori di compilazione (s) utilizzando [email protected], però, perché la prima riga del codice è return;, non verrà eseguito.


Nota: I ringraziamenti per l'utente mob per la chat disponibile e la correzione del codice.

+1

Questo compila ed esegue il codice, non solo lo compila. – mob

+0

valutando 'exit', tuttavia, uscirà dal programma chiamante. Forse usate 'return' o avvolgete il codice in' if (0) {...} ' – mob

+0

' perl -e 'eval ("exit 1;/more valid code /;"); print "hey I was right!" '|| echo 'Oh aspetta, immagino che mob avesse ragione.' ' – mob

6

La compilazione di uno script ha molti effetti collaterali. Ne risultano sottoserie in corso di definizione. Risulta l'esecuzione di moduli. ecc. Se vuoi semplicemente verificare se qualcosa si compila, tu vuoi un interprete separato. È l'unico modo per essere sicuri che uno dei test su uno script non causi falsi positivi o falsi negativi.

+0

Aggiunta l'ultima frase per chiarire il punto. – ikegami

1

Non ti piacerebbe qualcosa del genere?

open(FILE,"perl -c generated_script.pl 2>&1 |"); 
@output=<FILE>; 
if(join('',@output)=~/syntax OK/) 
{ 
    printf("No Problem\n"); 
} 
close(FILE); 
+0

anziché piping, c'è qualche ragione per non usare i backtick? –

+0

Ti amo! Grazie mille. Questa soluzione specifica di tubazioni mi ha davvero aiutato nel mio caso specifico! – gideon

1

Vedi Test::Compile modulo, in particolare pl_file_ok() funzione.

Problemi correlati