为什么这个程序有效? 我试图创建一个语法错误

我在Windows 7上运行ActiveState的32位ActivePerl 5.14.2。我想要用Git pre-commit hook来检测正在检查的语法错误的程序。 (不知何故,我只是设法做了这么糟糕的提交。)所以作为一个测试程序,我随机记下了这个:

use strict;
use warnings;

Syntax error!

exit 0;

但是,它编译和执行时没有警告,退出时errorlevel为零。 这个有效的语法如何?


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

看起来,解析器认为你正在调用方法Syntax上的error ...确实奇怪!


你没有得到错误的原因是第一个被执行的代码是

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
链接地址: http://www.djcxy.com/p/66363.html

上一篇: Why is this program valid? I was trying to create a syntax error

下一篇: 8 encoding in Python source