首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl quine的解释

perl quine的解释
EN

Stack Overflow用户
提问于 2013-10-10 08:18:57
回答 2查看 817关注 0票数 3

我最近发现了这个奎因

代码语言:javascript
复制
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);

我就是没法把头绕着它。我在google上没有找到任何解释,所以我希望有人能向我解释一下这个东西的工作原理:-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-10 08:31:47

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

(39是单引号,'是换行符,当解释为%c时,10是换行符\n )所以$a的开头是

代码语言:javascript
复制
$a=%c%s%c;printf($a,39,$a,39,10);%c

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

代码语言:javascript
复制
$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)

最后

代码语言:javascript
复制
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);\n
                                             (last %c replaced) ^^ 
票数 3
EN

Stack Overflow用户

发布于 2013-10-10 08:39:32

这段代码由两行组成。

可变赋值:

代码语言:javascript
复制
$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';

和一个printf

代码语言:javascript
复制
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
  • 下一个39printf的第四个参数%c
  • 最后,最后一个%c%c

这会导致它自己的源代码的副本。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19290540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档