tutorial strawberry logo historia perl

strawberry - perl tutorial



¿Por qué este programa es válido? Estaba intentando crear un error de sintaxis (5)

Como se señaló anteriormente, esto se debe a la notación de llamada al método indirecto. Puedes advertir sobre esto:

use strict; use warnings; no indirect; Syntax error! exit 0;

Produce:

Indirect call of method "Syntax" on object "error" at - line 5.

Esto requiere el módulo CPAN indirecto .

También puedes usar no indirect "fatal"; hacer que el programa muera (esto es lo que hago)

Estoy ejecutando ActiveSter''s ActivePerl 5.14.2 de 32 bits en Windows 7. Quería perder el tiempo con un enganche de Git de confirmación previa para detectar los programas que se registran con errores de sintaxis. (De alguna manera, me las arreglé para hacer un compromiso tan malo). Entonces, como un programa de prueba, anoté aleatoriamente esto:

use strict; use warnings; Syntax error! exit 0;

Sin embargo, se compila y ejecuta sin advertencias, y errorlevel es cero en la salida. ¿Cómo es esta sintaxis válida?


La razón por la que no recibe un error es que el primer código ejecutado es

exit(0);

Porque no tenías un punto y coma en la primera línea:

Syntax error!

¡El compilador adivina (incorrectamente) que esta es una llamada de subrutina con un operador not ! lanzado. Luego ejecutará los argumentos de esta subrutina, que es la exit(0) , momento en el que el programa sale y establece el nivel de errores en 0. No se ejecuta nada más, por lo que no se informan más errores de tiempo de ejecución.

Notará que si cambia la exit(0) a algo como print "Hello world!" usted recibe un error:

Can''t locate object method "Syntax" via package "error" ...

y su nivel de error se establecerá:

> echo %errorlevel% 255


No sé por qué, pero esto es lo que hace Perl:

perl -MO=Deparse -w yuck BEGIN { $^W = 1; } use warnings; use strict ''refs''; ''error''->Syntax(!exit(0)); yuck syntax OK

Parece que el analizador piensa que estás llamando al método Syntax en el error -objeto ... ¡Es extraño!


Perl tiene una sintaxis llamada "notación de método indirecto". Permite

Foo->new($bar)

para ser escrito como

new Foo $bar

Entonces eso significa

Syntax error ! exit 0;

es lo mismo que

error->Syntax(! exit 0);

o

error->Syntax(!exit(0));

No solo es una sintaxis válida, sino que no genera un error en el tiempo de ejecución porque lo primero que se ejecuta es exit(0) .


Prueba Perl 6 , parece cumplir tus expectativas más fácilmente:

===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