Dlaczego ten program jest ważny? Próbowałem stworzyć błąd składni
Uruchamiam ActiveState 32 bit ActivePerl 5.14.2 na Windows 7. Chciałem pogrywać z Hookiem Git pre-commit, aby wykryć programy sprawdzane z błędami składni. (Jakoś udało mi się zrobić taki zły commit.) Więc jako program testowy przypadkowo zapisałem to:
use strict;
use warnings;
Syntax error!
exit 0;
Jednak kompiluje i wykonuje bez ostrzeżeń, a poziom błędu wynosi zero przy wyjściu. Jak to jest poprawna składnia?
5 answers
Perl posiada składnię zwaną "notacją metody pośredniej". Pozwala
Foo->new($bar)
Należy zapisać jako
new Foo $bar
Czyli
Syntax error ! exit 0;
Jest tym samym co
error->Syntax(! exit 0);
Lub
error->Syntax(!exit(0));
Nie tylko jest to poprawna składnia, ale nie powoduje błędu w czasie wykonywania, ponieważ pierwszą rzeczą wykonaną jest exit(0)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 20:36:00
Nie wiem dlaczego, ale tak właśnie robi Perl:
perl -MO=Deparse -w yuck
BEGIN { $^W = 1; }
use warnings;
use strict 'refs';
'error'->Syntax(!exit(0));
yuck syntax OK
Wygląda na to, że parser myśli, że wywołujesz metodę Syntax
w obiekcie error
-... Rzeczywiście dziwne!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 13:48:57
Powodem, dla którego nie otrzymujesz błędu jest to, że pierwszy wykonany kod to
exit(0);
Ponieważ nie miałeś średnika w pierwszej linii:
Syntax error!
Kompilator odgadnie (niepoprawnie), że jest to wywołanie podprogramu z operatorem not
!
. Następnie wykonuje argumenty do tego podprogramu, którym jest exit(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 ma więcej błędów runtime zgłoszone.
Zauważysz, że jeśli zmienisz exit(0)
na coś podobnego print "Hello world!"
, otrzymasz błąd:
Can't locate object method "Syntax" via package "error" ...
I twój poziom błędu zostanie ustawiony:
> echo %errorlevel%
255
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-11 16:19:03
Jak wspomniano powyżej, jest to spowodowane przez metodę pośrednią wywołującą notację. Możesz ostrzec o tym:
use strict;
use warnings;
no indirect;
Syntax error!
exit 0;
Produkuje:
Indirect call of method "Syntax" on object "error" at - line 5.
Wymaga to pośredniego modułu CPAN .
Możesz również użyć no indirect "fatal";
, aby spowodować śmierć programu (to jest to, co robię)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 14:07:28
Spróbuj Perl 6 , wydaje się, że łatwiej spełni Twoje oczekiwania:
===SORRY!=== Error while compiling synerror.p6
Negation metaoperator not followed by valid infix
at synerror.p6:1
------> Syntax error!⏏<EOL>
expecting any of:
infix
infix stopper
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-05 21:00:05