Как это кодирует работу вообще?
#!/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;}
Данные из файла загружаются в программу, называемую интерпретатором Perl. Интерпретатор анализирует код и преобразует его в серию «кодов операций» - язык байт-кода, который находится на полпути между кодом Perl и машинным языком, на котором выполняется этот код. Если в процессе преобразования (называемого «компиляцией») ошибок не было, то код выполняется другой частью интерпретатора Perl. Во время выполнения программа может изменять различные состояния машины, такие как выделение, освобождение, чтение и запись в память или использование ввода / вывода и других функций системы.
(CW - Больше хакеров, чем я, могут исправить любые ошибки или заблуждения и добавить дополнительную информацию)
Давайте сначала пропустим это через 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;
}
Первая строка очевидна.
Вторая строка составляет список ">>> E!)", ">>> E)", ">>> E", ">>>", ">>", ">" , ""
, и все они должны быть одинаковой длины, а также добавляется звездочка и «Shift Out» (символ после возврата каретки).
Третья строка добавляет в этот список элементы с 5 по 1 (в указанном порядке), так что это будет ">>> E!)", ">>> E)", ">>> E "," >>> "," >> ","> "," ","> "," >> "," >>> "," >>> E "
.
Карта уменьшает все символы на единицу, создавая таким образом элементы типа 8 === D ()
.
Второй цикл просто печатает элементы в списке в цикле каждые 0,25 секунды. Возврат каретки заставляет их перезаписывать друг друга, так что видна анимация. Последние несколько строк никогда не достигаются и, следовательно, являются фиктивными.
Здесь нет никакой магии, просто обфускация. Давайте рассмотрим все на высоком уровне. Первое, что следует заметить, это то, что в дальнейшем каждый символ в строках интерпретируется как предыдущий:
[1] map{chr(ord()-1)} ...
Таким образом, строка типа "6qD" приведет к "5rC" (символы перед '6', 'q' и 'D', соответственно). Основной интерес представляет массив строк в самом начале:
[2] ">>>E!)",">>>E)",">>>E",">>>",">>",">",""
Он определяет последовательность "масок", которые мы позже подставим в эту строку:
[3] "9$_*\x{0e}"
Они будут вставлены в точке $_
. Строка \x{0e}
представляет собой шестнадцатеричный управляющий символ; обратите внимание, что \x{0d}
, символ непосредственно перед ним, является возвратом каретки. Именно он будет заменен на [3], когда мы выполним [1].
Перед сборкой строки [3] мы добавляем число !
, равное i, к каждому элементу в [2]. Каждый последующий элемент получает на один больше!
, чем предыдущий элемент. Обратите внимание, что символ, значение которого находится непосредственно перед !
является пробел .
Остальная часть сценария выполняет итерации по каждому из элементов собранного массива, которые теперь выглядят примерно так:
[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"
Затем операция reverse
добавляет те же элементы в обратном порядке, создавая цикл.
На этом этапе вы должны увидеть, как появляется паттерн, который создает анимацию. Теперь остается только пройти через каждый шаг анимации и вернуться обратно, что и выполняется остальной частью сценария. Временная задержка каждого шага регулируется оператором select:
[5] select undef, undef, undef, 0.25
который указывает нам ждать 250 миллисекунд между каждой итерацией. Вы можете изменить это значение, если хотите, чтобы процесс ускорился или замедлился.