这个Perl一线工作如何实际工作?

所以,我碰巧注意到last.fm正在我的地区招聘,而且自从我知道几个人who worked there以后,我虽然申请了。

但是我以为我最好先看看current staff

该页面上的每个人都有一个可爱的/聪明/笨拙的领带,像“生命不是一千倍,我们无法自拔”?其实这是很有趣的,直到我得到这个:

perl -e'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'

我无法抗拒粘贴到我的终端(这是一个愚蠢的事情,也许),但它打印:

Just another Last.fm hacker,

我以为比较容易弄清楚Perl一线工作原理。但是我无法真正理解这些文档,而且我不知道Perl,所以我甚至不知道我在阅读相关的文档。

所以我尝试修改数字,这让我无处不在。所以我决定这是非常有趣的,值得一提的。

所以,“怎么工作”有点模糊,我的问题主要是,

那些数字是什么?为什么有负数和正数,负面或积极性是否重要?

运算符组合= $ _做什么?

什么是包q,c * ,,在做什么?

这是“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是一个功能,而printmaplist operators.无论哪种方式,紧随其后加一个加号的函数或非空值操作符名称都不能用作二进制运算符,所以开始的两个符号都是unary operators。这个奇怪在manual中描述。

如果我们添加圆括号,请使用块语法进行映射,并添加一些空格,我们得到:

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之前或之后的ASCII顺序。

为了您的下一个任务,请解释此JAPH(EyesDrop生成)。

''=~('(?{'.('-)@.)@_*([]@!@/)(@)@-@),@(@@+@)'
^'][)@]`}`]()`@.@]@%[`}%[@`@!#@%[').',"})')

不要在生产代码中使用任何这些。

http://stackoverflow.com/questions/10858682/how-does-this-perl-one-liner-actually-work

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:这个Perl一线工作如何实际工作?