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