这段代码怎么样?
#!/usr/bin/perl
$i=4;$|=@f=map{("!"x$i++)."K$_^\x{0e}"}
"BQI!\\","BQI\\","BQI","BQ","B","";push
@f,reverse@f[1..5];@f=map{join"",undef,
map{chr(ord()-1)}split""}@f;{;$f=shift@
f;print$f;push@f,$f;select undef,undef,
undef,.25;redo;last;exit;print or die;}
Run Code Online (Sandbox Code Playgroud)
Leo*_*ans 16
让我们首先通过perltidy
$i = 5;
$| = @f = map { ("!" x $i++) . "9$_*\x{0e}" } ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "";
push @f, reverse @f[ 1..5 ];
@f = map {
join "",
map { chr(ord() - 1) }
split //
} @f;
{
$f = shift @f;
print $f;
push @f, $f;
select undef, undef, undef, .25;
redo;
last;
exit;
print or die;
}
Run Code Online (Sandbox Code Playgroud)
第一行是显而易见的.
第二行创建一个列表">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", ""
,并将它们全部隔开,并添加一个星号和一个'Shift Out'(回车后的字符).
第三行将项目5到1(按此顺序)附加到该列表,因此它将是">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", ">", ">>", ">>>", ">>>E"
.
地图将所有字符减1,从而创建像8===D ()
.
第二个循环只需每0.25秒循环打印一次循环中的元素.回车使它们相互覆盖,从而可以看到动画.最后几行永远不会到达,因此是虚假的.
mob*_*mob 14
来自文件的数据被加载到称为Perl解释器的程序中.解释器解析代码并将其转换为一系列"操作码" - 一种字节码语言,它位于Perl代码和代码运行的机器语言之间.如果转换过程中没有错误(称为"编译"),则代码由Perl解释器的另一部分执行.在执行期间,程序可以改变机器的各种状态,例如分配,解除分配,读取和写入存储器,或者使用输入/输出和系统的其他特征.
(CW - 比我欢迎的更多铁杆黑客更正任何错误或误解并添加更多信息)
这里没有魔法,只是混淆.让我们采取高层次的观点.首先要注意的是,稍后,字符串中的每个字符都被解释为它是前一个字符:
[1] map{chr(ord()-1)} ...
Run Code Online (Sandbox Code Playgroud)
因此,像"6qD"这样的字符串将导致"5rC"(分别在'6','q'和'D'之前的字符).主要的兴趣点是开头附近的字符串数组:
[2] ">>>E!)",">>>E)",">>>E",">>>",">>",">",""
Run Code Online (Sandbox Code Playgroud)
这将我们稍后将替换的一系列"掩码"定义到此字符串中:
[3] "9$_*\x{0e}"
Run Code Online (Sandbox Code Playgroud)
它们将被插入到该$_
点.该字符串\x{0e}
表示十六进制控制字符; 请注意,\x{0d}
就在它之前的字符是回车.当我们做[1]时,这将被替换为[3].
在[3]字符串汇编之前,我们!
在[2]中为每个元素添加一个等于i 的数字.每个连续的元素!
比它之前的元素多一个.请注意,其值之前的字符!
是空格.
The rest of the script iterates over each of the assembled array elements, which now look more like this:
[4] "!!!!!9>>>E!)\x{0e}", ---> " 8===D ("
"!!!!!!9>>>E)\x{0e}", ---> " 8===D("
"!!!!!!!9>>>E\x{0e}", ---> " 8===D"
"!!!!!!!!9>>>\x{0e}", ---> " 8==="
"!!!!!!!!!9>>\x{0e}", ---> " 8=="
"!!!!!!!!!!9>\x{0e}", ---> " 8="
"!!!!!!!!!!!9\x{0e}", ---> " 8"
Run Code Online (Sandbox Code Playgroud)
Then the reverse
操作反向追加相同的元素,创建一个循环.
此时,您应该能够看到生成动画的模式emerge.现在只需要动画完成动画中的每一步,然后再返回,这是由脚本的其余部分完成的.每个步骤的时间步长延迟由select语句控制:
[5] select undef, undef, undef, 0.25
Run Code Online (Sandbox Code Playgroud)
它告诉我们在每次迭代之间等待250毫秒.如果要查看速度加快或减慢,可以更改此设置.