これは“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
関数への呼び出しであり、「現在の文字セット内の数字で指定された任意の数の文字」を意味します。これを書くための代替方法は、map
機能が順序で引数リストの要素に供給されるブロックを適用
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、main; $ t = "ちょうど別のPerlハッカー、\ n" ' –