首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个程序是有效的?我试图创建一个语法错误

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

Stack Overflow用户
提问于 2012-07-28 04:19:23
回答 6查看 26.1K关注 0票数 518

我在Windows7上运行的是ActiveState的32位ActivePerl 5.14.2,我想用一个Git预提交钩子来检测存在语法错误的程序。(不知何故,我只是设法完成了如此糟糕的提交。)因此,作为一个测试程序,我随机写了以下内容:

代码语言:javascript
运行
复制
use strict;
use warnings;

Syntax error!

exit 0;

但是,它在编译和执行时没有任何警告,并且在退出时errorlevel为零。这是怎样的有效语法呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-28 04:36:01

Perl有一种称为“间接方法表示法”的语法。它允许

代码语言:javascript
运行
复制
Foo->new($bar)

要写成

代码语言:javascript
运行
复制
new Foo $bar

所以这意味着

代码语言:javascript
运行
复制
Syntax error ! exit 0;

等同于

代码语言:javascript
运行
复制
error->Syntax(! exit 0);

代码语言:javascript
运行
复制
error->Syntax(!exit(0));

它不仅是有效的语法,而且不会导致运行时错误,因为首先执行的是exit(0)

票数 566
EN

Stack Overflow用户

发布于 2012-07-28 04:26:55

我不知道为什么,但这就是Perl对它的理解:

代码语言:javascript
运行
复制
perl -MO=Deparse -w yuck
BEGIN { $^W = 1; }
use warnings;
use strict 'refs';
'error'->Syntax(!exit(0));
yuck syntax OK

解析器似乎认为您正在调用error-object上的Syntax方法...确实很奇怪!

票数 117
EN

Stack Overflow用户

发布于 2012-07-28 04:36:41

您没有得到错误的原因是第一次执行的代码是

代码语言:javascript
运行
复制
exit(0);

因为第一行没有分号:

代码语言:javascript
运行
复制
Syntax error!

编译器将猜测(错误地)这是一个带有not操作符!的子例程调用。然后,它将执行该子例程的参数,该子例程恰好为exit(0),此时程序退出并将errorlevel设置为0。不会执行任何其他操作,因此不会再报告运行时错误。

您会注意到,如果您将exit(0)更改为类似于print "Hello world!"的值,您会得到一个错误:

代码语言:javascript
运行
复制
Can't locate object method "Syntax" via package "error" ...

您的错误级别将被设置为:

代码语言:javascript
运行
复制
> echo %errorlevel%
255
票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11695110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档