2013-01-21 33 views
19
not exp log srand xor s qq qx xor 
s x x length uc ord and print chr 
ord for qw q join use sub tied qx 
xor eval xor print qq q q xor int 
eval lc q m cos and print chr ord 
for qw y abs ne open tied hex exp 
ref y m xor scalar srand print qq 
q q xor int eval lc qq y sqrt cos 
and print chr ord for qw x printf 
each return local x y or print qq 
s s and eval q s undef or oct xor 
time xor ref print chr int ord lc 
foreach qw y hex alarm chdir kill 
exec return y s gt sin sort split 

與其他JAPH一樣,它會打印出「只是另一個perl黑客」。但是我希望對這個特定的JAPH正在利用的工作做一個半詳細的解析 - 我不擅長Perl,但是我可以通讀一些JAPH ......這是不行的。這個着名的JAPH是如何工作的?

+11

總是以:http://perldoc.perl.org/B/Deparse.html – toolic

+6

http://www.perlmonks.org/?node_id = 290623 – toolic

+1

@toolic啊,應該檢查Dojo - perl修士再次解決它 – PinkElephantsOnParade

回答

15

一旦你理解了基本知識,它確實不那麼難。下面是一些提示,讓你開始:

not exp log srand 
     # srand = 1, exp o log = id, not 1 = 0 

     # $_ = undef 
xor s// /x      
     # $_ = ' ' 
xor s//length uc ord and print chr ord for qw q join use sub tied q/ 
     # $_ = ' length uc ord and print chr ord for qw q join use sub tied q' 

xor eval 

注意,String的chr ord返回到底的第一個字符和join use sub tied具有的第一個字符just。 :)

只是爲了好玩,我寫的這個著名japhs年前的延伸:

not srand xor s qq qx xor s x x length uc 
ord and print uc chr ord for qw q join qx 
xor eval xor lc eval qq x abs cos ord and 
print chr ord for qw q use substr tied qx 
xor print qq q q xor int eval lc qq m cos 
and print chr ord for qw y abs ne or tied 
hex exp ref y m xor scalar srand print qq 
q q xor sin abs eval q x log srand ord or 
printf uc chr ord foreach qw q package qx 
xor sqrt eval lc qq y sqrt cos and printf 
chr ord for qw x each return local x y or 
print qq s s and uc exp eval q s undef or 
oct xor time xor ref print chr int ord lc 
for qw y hex alarm chdir kill exec return 
y s xor log exp eval q x print chr length 
join qw y length for map substr chr shift 
y x or sqrt abs ord lc and eval print q q 
q and s q q lcfirst chr eval log shift qx 

打印真正"Just another Perl hacker,\n"

這是含有德語聖誕賀卡的較小版本:

not exp log srand xor s qq qx xor 
s x x length uc ord and print chr 
ord for qw q find redo ord helpme 
eval scalar qx xor eval xor print 
q q q xor int eval lc q m cos and 
print chr ord for qw y flock each 
s tell y m gt sin ref study split 
+0

啊 - 提示顯示它。我現在看到了,嘿。 – PinkElephantsOnParade

11

此JAPH的首次出現似乎是http://www.perlmonks.org/?node_id=290607

作爲PerlMonks線程狀態,現在有一個自動工具這種模糊處理:http://namazu.org/~takesako/ppencode/

你可以閱讀它的source code,但逆向工程是非常有趣:)

舉例來說,這裏是打印空白代碼:

[email protected]:~$ perl -e 'length q chmod lc and print chr ord q q eq' 
[email protected]:~$ 

這是打印字符「」的唯一途徑?其實,不,清爽生產:

[email protected]:~$ perl -e 'oct oct hex ord q else and print chr ord q q q' 
[email protected]:~$ 

酷,兩種變型在同一and print chr ord q q ...結束。所以在此之前的一切都必須評估爲真正的價值,並且只是爲了玷污我們的眼睛。

然後,在這種情況下,print chr ord可簡化爲print,因爲chr(ord($str))只挑選$str中的第一個字符。所以它歸結爲:

[email protected]:~$ perl -e 'print q q eq' 
[email protected]:~$ 

q q eqq報價不尋常的表現,它更容易地理解爲q (e)。相同的邏輯適用於原始的,甚至更混亂的JAPH:print chr ord for qw y ... y將選取y個字符之間的所有內容,並以空格作爲數組分隔開。


有一個相關主題,它涉及Perl代碼形成一個ASCII藝術。此外,還有一個CPAN模塊:Acme::EyeDrops