Ich verwende ActiveStates 32-Bit- ActivePerl 5.14.2 unter Windows 7. Ich wollte mit einem Git-Pre-Commit-Hook herumspielen, um Programme zu erkennen, die mit Syntaxfehlern eingecheckt werden. (Irgendwie habe ich es gerade geschafft, ein so schlechtes Commit durchzuführen.) Als Testprogramm habe ich dies zufällig notiert:
use strict;
use warnings;
Syntax error!
exit 0;
Es wird jedoch ohne Warnungen kompiliert und ausgeführt, und die Fehlerstufe ist beim Beenden Null. Wie ist diese gültige Syntax?
no indirect
diese passierenwhatever / 25 ; # / ; die "this dies!";
Antworten:
Perl hat eine Syntax namens "indirekte Methodennotation". Es erlaubt
geschrieben werden als
Das bedeutet also
ist das gleiche wie
oder
Es ist nicht nur eine gültige Syntax, es führt auch nicht zu einem Laufzeitfehler, da als erstes ausgeführt wird
exit(0)
.quelle
!exit(0)
kann nicht mehr ein!$x
Tippfehler sein, als da beide nicht getippt sind.new Class
undprint $fh ...
anstelle vonClass->new(...)
und verwenden$fh->print(...)
. Ich werde Ihnen gewähren, dass es eine seltsame Fehlermeldung verursachtIch weiß nicht warum, aber das macht Perl daraus:
Es scheint, dass der Parser denkt, Sie rufen die Methode
Syntax
für daserror
Objekt auf ... In der Tat seltsam!quelle
exit(0)
zuerst ausgewertet wird und das Programm beendet wird, bevor es versucht, das Ergebnis an zu übergeben'error'->Syntax()
.new Class
anstelle von verwendet wirdClass->new()
. Um die Methode aufzurufenSyntax
, wird dieexit
Funktion ausgeführt, sodass der Laufzeitfehler nie auftritt.use strict; use warnings; error->Syntax(! print "hi");
Ausbeuten: Syntax Ok auch für Perl -MO = Deparse, aberuse warnings
damit sollte wahrscheinlich etwas gesagt werden, da es herausfinden kann, dass es nicht geladen wird. Stattdessen wird ein Laufzeitfehler "Objektmethode kann nicht gefunden werden ..." ausgegeben.Der Grund, warum Sie keinen Fehler erhalten, ist, dass der erste ausgeführte Code ist
Weil Sie in der ersten Zeile kein Semikolon hatten:
Der Compiler vermutet (fälschlicherweise), dass dies ein Unterprogrammaufruf mit einem eingeworfenen
not
Operator ist!
. Anschließend führt er die Argumente für dieses Unterprogramm aus. Zu diesemexit(0)
Zeitpunkt wird das Programm beendet und die Fehlerstufe auf 0 gesetzt. Es wird nichts anderes ausgeführt , werden also keine Laufzeitfehler mehr gemeldet.Sie werden feststellen, dass beim Wechsel
exit(0)
zu etwas wieprint "Hello world!"
Ihnen eine Fehlermeldung angezeigt wird:und Ihre Fehlerstufe wird eingestellt:
quelle
>The compiler will guess (incorrectly)
Der Compiler kann nichts falsch machen.Wie oben erwähnt, wird dies durch die indirekte Methode verursacht, die die Notation aufruft. Sie können darauf warnen:
Produziert:
Dies erfordert das indirekte CPAN-Modul .
Sie können auch verwenden
no indirect "fatal";
, um das Programm zum Absterben zu bringen (das ist, was ich tue)quelle
Probieren Sie Perl 6 aus , es scheint Ihre Erwartungen leichter zu erfüllen:
quelle
TLDR; Kaum
quelle