2012-09-08 8 views
6

Jestem stosunkowo nowy w Perlu i pracuję na plikach Perl napisanych przez kogoś innego, a ja zachować napotykając następujące oświadczenie na początku skryptów:Długi eval ciąg w beginnning skryptu Perl

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"[email protected]"}' && eval 'exec perl -w -S $0 $argv:q' 
    if 0; 

Co robią te dwie linie? Co to jest sprawdzanie kodu? i co robi zdanie if 0;?

Odpowiedz

8

To jest wariant exec hack. W dniach przed interpretacją można było określić w sposób wiarygodny za pomocą #!, to było używane do tworzenia powłoki perl exec. if 0 w drugiej linii nigdy nie jest odczytywane przez powłokę, która czyta tylko pierwszą linię i wykonuje perl, który czyta if 0 i nie wykonuje ponownie samego siebie.

To interesujący wariant, ale nie do końca poprawny. Wydaje się być skonfigurowany do pracy z powłoką bourne lub z wariantami csh, przy użyciu początkowej eval, aby określić powłokę, która je parsuje, a następnie za pomocą odpowiedniej składni przekazać argumenty do perla. Środkowa klauzula to składnia sh, a ostatnia klauzula jest odpowiednia dla csh. Jeśli drugi && byłby ||, a początkowy eval '(exit $?0)' rzeczywiście zawiedzie w csh, wtedy osiągnęłoby to te cele, ale jak napisałem, nie sądzę, żeby to działało dla csh. Czy istnieje polecenie poprzedzające to, które ustawiłoby pewną wartość opartą na powłoce? Ale nawet gdyby tak było, a $? jest ustawiona na wartość niezerową, to nic nie zostanie wykonane, chyba że && zostanie zastąpione przez . Dzieje się coś śmiesznego.

+0

Dzięki! Czym jest "exec hack"? Masz na myśli "shebang"? –

+0

Hack exec jest w zasadzie dowolną techniką, która używa exec do wywoływania określonego interpretera zamiast używania linii shebang. –

+0

Dzięki! jaka byłaby odpowiednia linia "shebang"? W jakiś sposób ta kontrola 'eval' wygląda o wiele bardziej złożona niż po prostu prośba o użycie określonego binarnego/interpretera. –