[英]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.