2012-06-22 10 views
5

Mam skrypt Perl, który pobiera dane użytkownika i tworzy inny skrypt, który będzie uruchamiany w późniejszym terminie. Obecnie przechodzę i piszę testy dla tych skryptów i jednym z testów, które chciałbym wykonać, jest sprawdzenie, czy wygenerowany skrypt poprawnie się kompiluje (np. perl -c <script>.) Czy istnieje sposób, że mogę Perl wykonać kompilację na wygenerowany skrypt bez konieczności tworzenia kolejnego procesu Perla? Próbowałem wyszukiwać odpowiedzi, ale wyszukiwania tylko podnoszą informacje o kompilowaniu skryptów Perla do programów wykonywalnych.Jak mogę skompilować skrypt Perl wewnątrz działającej sesji Perl?

+0

Co masz na myśli mówiąc "kompilacja" dokładnie? Sprawdź błędy? Lub wykonać to? –

+0

@ user1215106 Sprawdź błędy, a nie uruchom go. Chcę się upewnić, że skrypt nie zakończy się niepowodzeniem z powodu błędów składniowych po uruchomieniu później. – Joel

+0

Czy tworzysz kod dynamicznie w swoim skrypcie? –

Odpowiedz

3

Aby wykonać kod generowany dynamicznie, należy eval funkcję:

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

__DATA__ 

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

Jednak jeśli chcesz tylko skompilować lub sprawdzić składnię, to nie będzie w stanie to zrobić w ciągu jednej sesji Perl.

Funkcja syntax_ok z biblioteki Test::Strict uruchom sprawdzanie składni, uruchamiając perl -c z zewnętrznym interpreerem perla, więc zakładam, że nie ma wewnętrznej drogi.

Tylko obejście, które mogą pracować dla Ciebie byłoby:

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"; 

W tym wypadku będzie można sprawdzić błędu (ów) kompilacji używając [email protected], jednak ponieważ pierwsza linia kodu to jest return;, nie zostanie wykonany.


Uwaga: Dzięki za pomocny użytkownik mob czat i korekty kodu.

+1

To skompiluje i wykona kod, a nie tylko go skompiluje. – mob

+0

ocenianie 'exit', jednak zakończy program wywołujący. Może użyj 'return' lub zawiń kod w' if (0) {...} ' – mob

+0

' perl -e 'eval ("exit 1;/more valid code /;"); print "hej, miałem rację!" "|| echo 'O, czekaj, chyba mob miał rację.' ' – mob

6

Kompilowanie skryptu ma wiele efektów ubocznych. Powoduje to zdefiniowanie podsadzek. Powoduje to uruchomienie modułów. Jeśli chcesz po prostu sprawdzić, czy coś się kompiluje, musisz osobny interpreter. Jest to jedyny sposób, aby upewnić się, że testowanie jednego skryptu nie powoduje późniejszych testów w celu uzyskania fałszywych trafień lub fałszywych negatywów.

+0

Dodano ostatnie zdanie, aby wyjaśnić mój punkt widzenia. – ikegami

1

Czy coś takiego nie działa dla Ciebie?

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

zamiast rur, czy jest jakikolwiek powód, aby nie używać zwrotnych? –

+0

Kocham cię! Dziękuję bardzo. To konkretne rozwiązanie orurowania naprawdę pomogło w moim konkretnym przypadku! – gideon