這是「Just another Perl hacker」,一個Perl米姆的變體。隨着JAPH的進行,這一個相對比較溫和。
您需要做的第一件事就是弄清楚如何解析perl程序。它缺乏函數調用前後括號,並使用+
和報價般的運營商以有趣的方式。原來的計劃是這樣的:
print+pack+q,c*,,map$.+=$_,74,43,-2,1,-84, 65,13,1,5,-12,-3, 13,-82,44,21, 18,1,-70,56, 7,-77,72,-7,2, 8,-6,13,-70,-34
pack
是一個函數,而print
和map
是list operators。無論採用哪種方式,函數或非零運算符名稱後面緊跟着一個加號,都不能使用+
作爲二元運算符,因此+
開頭的符號都是unary operators。這種古怪在manual中有描述。
如果加上括號,使用塊語法map
,並添加一點空白,我們得到:
print(+pack(+q,c*,,
map{$.+=$_} (74,43,-2,1,-84, 65,13,1,5,-12,-3, 13,-82,44,21,
18,1,-70,56, 7,-77,72,-7,2, 8,-6,13,-70,-34)))
下一個棘手的一點是,q
這裏是q
quote-like operator。它是更常見的寫單引號:
print(+pack(+'c*',
map{$.+=$_} (74,43,-2,1,-84, 65,13,1,5,-12,-3, 13,-82,44,21,
18,1,-70,56, 7,-77,72,-7,2, 8,-6,13,-70,-34)))
記住一元加號是無操作(除了強制標量上下文中),這樣的事情,現在應該尋找更熟悉。這是對pack
函數的調用,用c*
的格式,這意味着「任何數量的字符,由他們在當前的字符集數指明」。寫這的另一種方法是
print(join("", map {chr($.+=$_)} (74, …, -34)))
的map
功能所提供的塊適用於參數列表,以便該元件。對於每個元素,$_
設置爲元素值,並且調用的結果是通過在連續元素上執行塊返回的值的列表。寫這個程序更長的方式將是
@list_accumulator =();
for $n in (74, …, -34) {
$. += $n;
push @list_accumulator, chr($.)
}
print(join("", @list_accumulator))
的$.
變量包含運行總的數字。這些數字被選擇爲使得運行總數是作者想要打印的字符的ASCII碼:74 = J
,74 + 43 = 117 = u
,74 + 43-2 = 115 = s
等。它們是負數或取決於每個字符是在ASCII順序中的前一個還是之後。
爲了您的下一個任務,請解釋此JAPH(由EyesDrop生成)。
''=~('(?{'.('-)@.)@_*([]@[email protected]/)(@)@[email protected]),@(@@[email protected])'
^'][)@]`}`]()`@[email protected]]@%[`}%[@`@!#@%[').',"})')
請勿在生產代碼中使用任何此類代碼。
我現在的:'(* STORE,* TIESCALAR)= map {eval「sub {$ _}」} qw'map {print && sleep $ |} split //,pop bless \ $ | ++'; tie $ T,主; $ T = 「又一個Perl愛好者,\ n」' –