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?
risposta
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.
Questo compila ed esegue il codice, non solo lo compila. – mob
valutando 'exit', tuttavia, uscirà dal programma chiamante. Forse usate 'return' o avvolgete il codice in' if (0) {...} ' – mob
' perl -e 'eval ("exit 1;/more valid code /;"); print "hey I was right!" '|| echo 'Oh aspetta, immagino che mob avesse ragione.' ' – mob
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.
Aggiunta l'ultima frase per chiarire il punto. – ikegami
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);
anziché piping, c'è qualche ragione per non usare i backtick? –
Ti amo! Grazie mille. Questa soluzione specifica di tubazioni mi ha davvero aiutato nel mio caso specifico! – gideon
Vedi Test::Compile
modulo, in particolare pl_file_ok()
funzione.
- 1. Come compilare uno script Perl su un eseguibile di Windows con Strawberry Perl?
- 2. Come posso ottenere uno script Perl per vedere le variabili in un altro script Perl?
- 3. Come posso ssh all'interno di uno script Perl?
- 4. Come posso eseguire il debug di uno script Perl?
- 5. Perl: Come posso ottenere Emacs per aggiungere virgolette al percorso completo di uno script Perl?
- 6. Come posso eseguire uno script Perl su Mac OS X?
- 7. Come deobfusacte correttamente uno script Perl?
- 8. Come posso chiamare uno script Perl da PHP?
- 9. Come ottenere il nome dello script Perl in esecuzione
- 10. Come posso eseguire automaticamente una grande quantità di script perl?
- 11. Come posso ottenere una traceback in Perl?
- 12. Utilizzo di ARGV e CGI in uno script Perl
- 13. In che modo Perl interagisce con gli script in esecuzione?
- 14. Come potrei nascondere/proteggere password da uno script Perl
- 15. Come posso compilare il mio script Perl in modo che possa essere eseguito su sistemi senza perl installato?
- 16. Come posso eseguire uno script Perl come un demone di sistema in linux?
- 17. Qualsiasi criterio quando $ 0 di uno script Perl diventa nullo?
- 18. Come posso sapere se il mio script Perl è in esecuzione in Windows?
- 19. Come posso spostare i file nel Cestino in uno script batch di Windows o in Perl?
- 20. Come posso racchiudere una stringa in Perl?
- 21. Come posso serializzare una chiusura in Perl?
- 22. Creazione di script Perl * esecuzione automatica * con flag
- 23. Come posso avere asserzioni variabili in Perl?
- 24. Come compilare uno script julia?
- 25. Reverse Engineering uno script Perl basato su un core dump
- 26. Come utilizzare i moduli beta Perl dagli script Perl beta?
- 27. Come posso creare una classe Perl?
- 28. Controllare l'utilizzo della CPU di uno script perl?
- 29. In Perl, come posso disabilitare CGI :: Carp che è stato caricato in uno script richiesto?
- 30. Come posso formattare le date in Perl?
Cosa intendi per "compilare" esattamente? Controlla gli errori? O eseguirlo? –
@ 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
Il codice viene creato dinamicamente nello script? –