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?
Odpowiedz
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.
To skompiluje i wykona kod, a nie tylko go skompiluje. – mob
ocenianie 'exit', jednak zakończy program wywołujący. Może użyj 'return' lub zawiń kod w' if (0) {...} ' – mob
' perl -e 'eval ("exit 1;/more valid code /;"); print "hej, miałem rację!" "|| echo 'O, czekaj, chyba mob miał rację.' ' – mob
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.
Dodano ostatnie zdanie, aby wyjaśnić mój punkt widzenia. – ikegami
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);
zamiast rur, czy jest jakikolwiek powód, aby nie używać zwrotnych? –
Kocham cię! Dziękuję bardzo. To konkretne rozwiązanie orurowania naprawdę pomogło w moim konkretnym przypadku! – gideon
Zobacz moduł Test::Compile
, zwłaszcza pl_file_ok()
funkcję.
- 1. Jak skompilować perl za pomocą DEBUG_LEAKING_SCALARS?
- 2. Jak mogę odwołać się do podprogramu Perl?
- 3. Jak mogę unbless obiektu w Perl?
- 4. Jak mogę sprawdzić moduł Perl 6?
- 5. Jak mogę używać GTK3 z perl?
- 6. Perl: JavaScript :: Szablony V8 - od perl
- 7. Jak skompilować skrypt julia?
- 8. Jak sprawdzić, czy skrypt Perl działa w terminalu?
- 9. Wielowątkowość dla kodu perl
- 10. Jak pętli Perl stałej
- 11. Perl RegEx
- 12. Perl 6: Jak uzyskać nazwę funkcji od wewnątrz
- 13. Perl: tajemnica prędkości pisania?
- 14. debugowania Perl Wyrażenie regularne
- 15. Jak mogę przeprowadzić wyszukiwanie zbiorcze i zastąpić je Perl?
- 16. Alarm perl z podprocessem
- 17. excel wykresy używające perl
- 18. Jak mogę rozpowszechniać moją aplikację Perl jako pojedynczy plik?
- 19. Detect jak podprogram nazywa Perl
- 20. Perl argumenty podprogramów jak hash
- 21. Jak mogę ukryć/chronić hasła ze skryptu Perl
- 22. Perl skrypt - dodać dni do daty, aby dostać nową datę
- 23. Perl qr // i podstawienie
- 24. perl xs - zwracana tablica perl z tablicy c
- 25. Demystifying glob Perl (*)
- 26. Jak mogę uruchomić skrypt Perl jako demon systemu w systemie Linux?
- 27. Jak mogę sprawdzić, czy skrypt Perl wykonuje się w kontekście CGI?
- 28. Python odpowiednik perl -pe?
- 29. DynamoDB Perl Abstraction
- 30. zmienne dynamiczne w Perl
Co masz na myśli mówiąc "kompilacja" dokładnie? Sprawdź błędy? Lub wykonać to? –
@ 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
Czy tworzysz kod dynamicznie w swoim skrypcie? –