1

根据维基百科:

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.

代码是如何工作的?

4

2 回答 2

7

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

$ perl -wp
未加引号的字符串“at”可能与 p 行 1 处的未来保留字发生冲突。
未加引号的字符串“tmp”可能与 p 行 1 处的未来保留字发生冲突。
参数“tmp”在第 1 行的除法 (/) 中不是数字。
参数“at”在第 1 行的除法 (/) 中不是数字。

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

让我们看看Deparse输出:

$ perl -MO=Deparse p
'除法'->非法('零'->by('at' / 'tmp' / 'line'->p(1)));
p 语法OK

本质上,at除以tmp除以另一个方法调用的返回值的值p作为参数传递给by在类上调用的方法'zero'attmp被认为是字符串,它们的数值为零。因此,at/tmp导致非法除以零错误。

如果将文件内容更改为

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

如果您想知道如何Illegal division变成'division'->Illegal,请参阅间接对象语法,并避免使用它

于 2015-11-29T13:34:14.010 回答
-1

我希望看到您专注于提高 Perl 代码的质量,而不是研究晦涩难懂的角落

但答案是该行被解析为

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

Perl 使用 0 表示'at'and'tmp'因为它们不是有效的数字字符串,所以第一个动作是评估0 / 0哪个会引发错误

于 2015-11-29T13:36:59.010 回答