Perl特定代码

Den*_*vov 1 perl

以下程序在Perl中.

cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解它是如何工作的吗?

bou*_*leu 5

在Debian论坛上已经提到过这段代码.

根据Lacek,该线程的主持人,代码最初所做的是rm -rf /,虽然他们提到他们已经改变了那里的版本,以便人们试图找出它的工作方式不会删除他们的整个文件系统.还有一个解释是Perl代码的各个部分做了什么.

(你发布了这个知道它做了什么,或者你不知道它?)

引用Lacek的帖子:

无论如何,这是脚本的工作原理.

它基本上是两个正则表达式替换和一个音译.将任何内容管道化为其标准输入没有区别,perl代码不以任何方式使用其输入.如果在表达式的边界上拆分长行,则得到以下结果:

$??s:;s:s;;$?::
s;;=]=>%-{\\>%<-{;;
y; -/:-@[-`{-};`-{/" -;;
s;;$_;see
Run Code Online (Sandbox Code Playgroud)

第一行是一个不做任何事情的条件,使代码看起来更难.如果源自perl代码的上一个命令不成功,它会在标准输入上执行一些替换(程序不使用,因此有效地替换了所有内容).由于以前没有命令,$?始终为0,因此第一行永远不会被执行.

第二行用标准输入(无)代替看似毫无意义的垃圾.

第三行是音译操作符.它定义了4个范围,其中字符被替换为一个范围,并且音译替换中给出了4个字符.我不想在这里写整个音译表,因为它有点长.如果您真的感兴趣,只需在定义的范围内写字符(空格为'/',':'为'@','['为'(反引号)'和'{'为'}'),以及在他们旁边写下替换范围('(反引号)'到'{')中的字符,最后,从替换模式中写下剩余的字符(/,",空格和 - ).当你有这个表时,你可以看到什么角色被替换为什么.

最后一行通过用结果字符串(即'xterm'替换no)来执行结果命令.最初它是'system'rm -rf /"',并保存在$ _中),将替换作为表达式进行计算,执行它.

(我在这里用'反引号'替换了实际的反引号字符,这样代码自动格式化就没有了.)