Korzystam z 32-bitowej wersji ActivePerl 5.14.2 ActiveState w systemie Windows 7. Chciałem zadzierać z hakiem wstępnego zatwierdzania Git, aby wykryć programy sprawdzane z błędami składniowymi. (Jakimś cudem udało mi się zrobić tak złe zatwierdzenie.) Tak więc jako program testowy losowo zanotowałem:
use strict;
use warnings;
Syntax error!
exit 0;
Jednak kompiluje się i wykonuje bez ostrzeżeń, a poziom błędu wynosi zero przy wyjściu. Jaka jest ta poprawna składnia?
no indirect
powstrzymać te wydarzeniawhatever / 25 ; # / ; die "this dies!";
Odpowiedzi:
Perl ma składnię zwaną „notacją metod pośrednich”. To pozwala
pisać jako
Wiec to znaczy
jest taki sam jak
lub
Jest to nie tylko poprawna składnia, ale nie powoduje błędu w czasie wykonywania, ponieważ pierwszą rzeczą jest wykonanie
exit(0)
.źródło
!exit(0)
nie może być większym błędem niż,!$x
ponieważ żaden z nich nie jest wpisany.new Class
iprint $fh ...
zamiastClass->new(...)
i$fh->print(...)
. Przyznaję, że powoduje to dziwne komunikaty o błędachNie wiem dlaczego, ale właśnie to robi Perl:
Wygląda na to, że parser myśli, że wywołujesz metodę
Syntax
naerror
-object ... Dziwne!źródło
exit(0)
najpierw jest oceniany, co powoduje, że program kończy działanie, zanim spróbuje przekazać wynik'error'->Syntax()
.new Class
zamiastClass->new()
. Aby wywołać metodęSyntax
,exit
funkcja jest wykonywana, więc błąd czasu wykonania nigdy nie występuje.use strict; use warnings; error->Syntax(! print "hi");
Wydajność: Składnia Ok na perlu -MO = Deparse również, ale zuse warnings
tym powinien prawdopodobnie coś powiedzieć, ponieważ może dowiedzieć się, że nie jest ładowany. Zamiast tego generuje błąd czasu wykonywania „Nie można zlokalizować metody obiektu ..”.Powodem, dla którego nie pojawia się błąd, jest to, że pierwszy wykonany kod to
Ponieważ w pierwszym wierszu nie było średnika:
Kompilator zgadnie (niepoprawnie), że jest to wywołanie podprogramu z wrzuconym
not
operatorem!
. Następnie wykona argumenty tego podprogramu, który akurat jestexit(0)
, w którym to momencie program kończy działanie i ustawia poziom błędu na 0. Nic innego nie jest wykonywane , więc nie są zgłaszane więcej błędów środowiska wykonawczego.Zauważysz, że jeśli zmienisz
exit(0)
na coś takiegoprint "Hello world!"
, pojawi się błąd:a Twój poziom błędu zostanie ustawiony:
źródło
>The compiler will guess (incorrectly)
Kompilator nie może nic zrobić niepoprawnie.Jak wspomniano powyżej, jest to spowodowane notacją wywołującą metodę pośrednią. Możesz ostrzec o tym:
Produkuje:
Wymaga to pośredniego modułu CPAN .
Możesz także użyć,
no indirect "fatal";
aby spowodować śmierć programu (to właśnie robię)źródło
Wypróbuj Perl 6 , wydaje się, że łatwiej spełnia twoje oczekiwania:
źródło
TLDR; Ledwie
źródło