2015-11-29 68 views
1

根據Wikipedia:以下quine如何工作?

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.

c怎麼樣噢工作?

回答

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'attmp被認爲是字符串,並且它們的數值是零。因此,at/tmp導致非法除零錯誤。

你會得到同樣的錯誤,如果你改變了文件的內容

Stackoverflow hacker news one at /tmp/p line 1.

如果你想知道如何成爲Illegal division'division'->Illegal,見indirect object syntaxavoid using it

-1

我寧願看到你專注於提高你的Perl代碼的質量,而不是調查不起眼的角落

但是我的回答是,該行分析爲

'division'->Illegal('zero'->by('at'/'tmp'/'line'->p(1))); 

和Perl使用零對於'at''tmp',因爲它們不是有效的數字字符串,所以第一個操作是評估0/0,這會引發錯誤