Как этот запутываемый Perl кодирует работу?

Как это кодирует работу вообще?

#!/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;}
7
задан Brad Gilbert 23 February 2010 в 19:34
поделиться

3 ответа

Данные из файла загружаются в программу, называемую интерпретатором Perl. Интерпретатор анализирует код и преобразует его в серию «кодов операций» - язык байт-кода, который находится на полпути между кодом Perl и машинным языком, на котором выполняется этот код. Если в процессе преобразования (называемого «компиляцией») ошибок не было, то код выполняется другой частью интерпретатора Perl. Во время выполнения программа может изменять различные состояния машины, такие как выделение, освобождение, чтение и запись в память или использование ввода / вывода и других функций системы.

(CW - Больше хакеров, чем я, могут исправить любые ошибки или заблуждения и добавить дополнительную информацию)

14
ответ дан 6 December 2019 в 05:08
поделиться

Давайте сначала пропустим это через 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 секунды. Возврат каретки заставляет их перезаписывать друг друга, так что видна анимация. Последние несколько строк никогда не достигаются и, следовательно, являются фиктивными.

16
ответ дан 6 December 2019 в 05:08
поделиться

Здесь нет никакой магии, просто обфускация. Давайте рассмотрим все на высоком уровне. Первое, что следует заметить, это то, что в дальнейшем каждый символ в строках интерпретируется как предыдущий:

[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 миллисекунд между каждой итерацией. Вы можете изменить это значение, если хотите, чтобы процесс ускорился или замедлился.

8
ответ дан 6 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: