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