perl quine的解释

Vin*_*nce 3 perl quine

我最近发现了这个quine

$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';printf($a,39,$a,39,10);
Run Code Online (Sandbox Code Playgroud)

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

psx*_*xls 5

此代码由两行组成.

变量赋值:

$a='$a=%c%s%c;printf($a,39,$a,39,10);%c';
Run Code Online (Sandbox Code Playgroud)

还有一个printf:

printf($a,39,$a,39,10)
Run Code Online (Sandbox Code Playgroud)

首先让我们学习一些事情printf.如果您检查的sprintf文件,你会看到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
  • 最后10是最后一个%c

这导致了自己的源代码的副本.