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?

 472
Author: Peter Mortensen, 2012-07-28

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).

 518
Author: ikegami,
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!

 107
Author: pavel,
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
 50
Author: TLP,
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ę)

 32
Author: Mark Fowler,
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
 7
Author: moritz,
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