Estoy ejecutando ActivePerl 5.14.2 de 32 bits de ActiveState en Windows 7. Quería perder el tiempo con un enlace de precompromiso de Git para detectar programas que se registran con errores de sintaxis. (De alguna manera me las arreglé para hacer una mala confirmación). Entonces, como programa de prueba, escribí esto al azar:
use strict;
use warnings;
Syntax error!
exit 0;
Sin embargo, se compila y ejecuta sin advertencias, y el nivel de error es cero al salir. ¿Cómo es esta sintaxis válida?
no indirect
evitar que esos sucedanwhatever / 25 ; # / ; die "this dies!";
Respuestas:
Perl tiene una sintaxis llamada "notación de método indirecto". Permite
ser escrito como
Entonces eso significa
es lo mismo que
o
No solo es una sintaxis válida, sino que no genera un error de tiempo de ejecución porque lo primero que se ejecuta es
exit(0)
.fuente
!exit(0)
no puede ser más un error de tipo que!$x
ya que ninguno está escrito.new Class
y enprint $fh ...
lugar deClass->new(...)
y$fh->print(...)
. Sin embargo, le concederé que causa mensajes de error extrañosNo sé por qué, pero esto es lo que hace Perl:
Parece que el analizador cree que estás llamando al método
Syntax
en el objetoerror
... ¡Extraño en verdad!fuente
exit(0)
se evalúa primero, lo que hace que el programa salga antes de intentar pasar el resultado'error'->Syntax()
.new Class
lugar deClass->new()
. Para llamar al métodoSyntax
, laexit
función se ejecuta, por lo que el error en tiempo de ejecución nunca se produce.use strict; use warnings; error->Syntax(! print "hi");
Rendimientos: Sintaxis Ok en perl -MO = Deparse también, perouse warnings
probablemente debería decir algo, ya que puede darse cuenta de que no se está cargando. En su lugar, arroja un error de tiempo de ejecución "No se puede encontrar el método del objeto ...".La razón por la que no recibe un error es que el primer código ejecutado es
Debido a que no tenía un punto y coma en la primera línea:
El compilador adivinará (incorrectamente) que se trata de una llamada de subrutina con un
not
operador!
incluido. Luego ejecutará los argumentos de esta subrutina, que es el momentoexit(0)
, momento en el que el programa sale y establece el nivel de error en 0. No se ejecuta nada más. , por lo que no se informan más errores de tiempo de ejecución.Notarás que si cambias
exit(0)
a algo asíprint "Hello world!"
, obtienes un error:y tu nivel de error se establecerá:
fuente
>The compiler will guess (incorrectly)
El compilador no puede hacer nada incorrectamente.Como se señaló anteriormente, esto es causado por el método indirecto que llama notación. Puedes advertir sobre esto:
Produce:
Esto requiere el módulo indirecto CPAN .
También puedes usar
no indirect "fatal";
para hacer que el programa muera (esto es lo que hago)fuente
Pruebe Perl 6 , parece cumplir sus expectativas más fácilmente:
fuente
TLDR; Apenas
fuente