perl - win32 - 為什麼這個程序有效? 我試圖創建一個語法錯誤




win32 perl (4)

Perl有一個叫做“間接方法符號”的語法。 它允許

Foo->new($bar)

寫成

new Foo $bar

這意味著

Syntax error ! exit 0;

是相同的

error->Syntax(! exit 0);

要么

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

它不僅是有效的語法,它不會導致運行時錯誤,因為執行的第一件事是exit(0)

我在Windows 7上運行ActiveState的32位ActivePerl 5.14.2。我想要用Git pre-commit hook來檢測正在檢查的語法錯誤的程序。 (不知何故,我只是設法做了這麼糟糕的提交。)所以作為一個測試程序,我隨機記下了這個:

use strict;
use warnings;

Syntax error!

exit 0;

但是,它編譯和執行時沒有警告,退出時errorlevel為零。 這個有效的語法如何?


你沒有得到錯誤的原因是第一個執行的代碼是

exit(0);

因為第一行沒有分號:

Syntax error!

編譯器會猜測(不正確),這是一個使用not運算符的子程序調用! 然後它會執行這個子例程的參數,它恰好是exit(0) ,此時程序退出並將errorlevel設置為0.沒有其他任何操作被執行,因此不會報告更多的運行時錯誤。

你會注意到,如果你把exit(0)改成print "Hello world!" 你確實得到一個錯誤:

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

並且你的錯誤級別將被設置:

> echo %errorlevel%
255

我不知道為什麼,但這是Perl對它的看法:

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

看起來,解析器認為你正在調用方法Syntax上的error ...確實奇怪!


試試Perl 6 ,它似乎更容易滿足您的期望:

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




perl