根据维基百科:
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.
代码如何工作?
答案 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'
。 at
和tmp
被视为字符串,其数值为零。因此,at/tmp
会导致非法除错。
如果将文件内容更改为
,则会出现相同的错误
Stackoverflow hacker news one at /tmp/p line 1.
如果您想知道Illegal division
成为'division'->Illegal
的方式,请参阅indirect object syntax和avoid using it。
答案 1 :(得分:-1)
我更愿意看到您专注于提高Perl代码的质量,而不是调查模糊不清的角落
但答案是该行被解析为
'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));
和Perl对'at'
和'tmp'
使用零,因为它们不是有效的数字字符串,因此第一个操作是评估引发错误的0 / 0