根据维基百科:
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.
代码是如何工作的?
首先,尝试在打开警告的情况下运行它:
$ 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'。at和tmp被认为是字符串,它们的数值为零。因此,at/tmp导致非法除以零错误。
如果将文件内容更改为
Stackoverflow hacker news one at /tmp/p line 1.
如果您想知道如何Illegal division变成'division'->Illegal,请参阅间接对象语法,并避免使用它。
我希望看到您专注于提高 Perl 代码的质量,而不是研究晦涩难懂的角落
但答案是该行被解析为
'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));
Perl 使用 0 表示'at'and'tmp'因为它们不是有效的数字字符串,所以第一个动作是评估0 / 0哪个会引发错误