簡體   English   中英

為什么這個程序有效? 我試圖創建一個語法錯誤

[英]Why is this program valid? I was trying to create a syntax error

我在 Windows 7 上運行 ActiveState 的 32 位ActivePerl 5.14.2。我想弄亂一個 Git 預提交鈎子來檢測被簽入的程序是否有語法錯誤。 (不知何故,我只是設法做了一個如此糟糕的提交。)所以作為一個測試程序,我隨機記下了這個:

use strict;
use warnings;

Syntax error!

exit 0;

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

Perl 有一種稱為“間接方法表示法”的語法。 它允許

Foo->new($bar)

寫成

new Foo $bar

所以這意味着

Syntax error ! exit 0;

是相同的

error->Syntax(! exit 0);

或者

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

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

我不知道為什么,但這就是 Perl 所做的:

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

解析器似乎認為您正在對error -object 調用方法Syntax ......確實很奇怪!

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

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

如上所述,這是由間接方法調用符號引起的。 您可以對此發出警告:

use strict;
use warnings;
no indirect;

Syntax error!

exit 0;

產生:

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

這需要間接 CPAN 模塊

你也可以no indirect "fatal";使用no indirect "fatal"; 導致程序死亡(這就是我所做的)

試試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 的情況下在牆上塗抹油漆?

TLDR; 幾乎不

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM