perl quine的解释

时间:2013-10-10 08:18:57

标签: perl quine

我最近发现了这个问题

$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);

我无法理解它。我在google / SO上找不到这个特定的解释,所以我希望有人可以向我解释这个东西是如何工作的: - )

2 个答案:

答案 0 :(得分:5)

此代码由两行组成。

变量赋值:

$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';

printf

printf($a,39,$a,39,10)

首先让我们了解一些关于printf的内容。如果您选中sprintf documentation,则会看到printf('%c',39)将打印第{39}个'字符,而printf('%c',10)是换行符\n。另外需要注意的是printf会获取参数列表,这意味着printf('%s%s','foo','bar')会打印foobar

现在应该清楚printf($a,39,$a,39,10)采用$a的格式并执行以下4次转换(等于%字符串中$a个符号的数量)

  • 使用第二个参数39作为%c的第一次出现(查看$a变量),
  • 然后它使用$a
  • 字符串%s
  • 下一个39的{​​{1}}的第4个参数printf
  • ,最后是%c
  • 10

会生成自己的源代码副本。

答案 1 :(得分:3)

查看printf参数并手动替换它们,

39为单引号,'10在换算为\n时为换行符%c) 所以$a

开头
$a=%c%s%c;printf($a,39,$a,39,10);%c

成为(用^替换为下面标记的字符)

$a='%s%c;printf($a,39,$a,39,10);%c
   ^ (first %c replaced)
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c%c;printf($a,39,$a,39,10);%c
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (%s replaced)
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);%c
                                       ^ (second %c replaced)

最后

$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);\n
                                             (last %c replaced) ^^