这是“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”' –