以下是如何工作的?

时间:2015-11-29 13:23:11

标签: perl quine

根据维基百科:

  

quine是一个非空的计算机程序,它不接受任何输入并生成自己的源代码副本作为其唯一的输出

我看到了这段perl代码,但我无法弄清楚它是如何工作的。

  

将以下行保存在文件/tmp/p中,并将文件作为perl /tmp/p运行:

Illegal division by zero at /tmp/p line 1.

perl / tmp / p的输出是:

  

Illegal division by zero at /tmp/p line 1.

代码如何工作?

2 个答案:

答案 0 :(得分:7)

首先,尝试在启用警告的情况下运行它:

$ perl -w p
Unquoted string "at" may clash with future reserved word at p line 1.
Unquoted string "tmp" may clash with future reserved word at p line 1.
Argument "tmp" isn't numeric in division (/) at p line 1.
Argument "at" isn't numeric in division (/) at p line 1.

前两个警告来自编译阶段。

让我们看一下Deparse输出:

$ perl -MO=Deparse p
'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));
p syntax OK

本质上,at除以tmp除以另一个方法调用p的返回值的值作为参数传递给调用的方法by班级'zero'attmp被视为字符串,其数值为零。因此,at/tmp会导致非法除错。

如果将文件内容更改为

,则会出现相同的错误
  

Stackoverflow hacker news one at /tmp/p line 1.

如果您想知道Illegal division成为'division'->Illegal的方式,请参阅indirect object syntaxavoid using it

答案 1 :(得分:-1)

我更愿意看到您专注于提高Perl代码的质量,而不是调查模糊不清的角落

但答案是该行被解析为

'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));

和Perl对'at''tmp'使用零,因为它们不是有效的数字字符串,因此第一个操作是评估引发错误的0 / 0