これは、Perlのミームである「JustanotherPerlhacker」</a>の変種です。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
はリスト演算子です。いずれにせよ、関数または非null演算子名の直後にプラス記号を付けることは+
二項演算子として使用できないため、最初の両方の+
記号は単項演算子です。この奇妙な点は、マニュアルに記載されています。
括弧を追加し、のブロック構文を使用し、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
引用符のような演算子があることです。より一般的には一重引用符で記述されます。
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
関数は、指定されたブロックを引数リストの要素に順番に適用します。各要素について、$_
は要素値に設定され、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によって生成)について説明します。
''=~('(?{'.('-)@.)@_*([]@!@/)(@)@-@),@(@@+@)'
^'][)@]`}`]()`@.@]@%[`}%[@`@!#@%[').',"})')
本番コードではこれを使用しないでください。