Специфичный для Perl код - PullRequest
1 голос
/ 30 ноября 2011

Следующая программа на Perl.

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

Может кто-нибудь помочь мне понять, как она работает?

1 Ответ

5 голосов
/ 30 ноября 2011

Этот бит кода уже спрашивали о на форумах Debian .

По словам Ласека, модератора в этой теме, первоначально код делал rm -rf /, хотя они упоминают, что там изменили версию, чтобы люди, пытающиеся выяснить, как это работает, не удаляли всю файловую систему. , Там также есть объяснение того, что делают различные части кода Perl.

(Вы опубликовали это, зная, что он сделал, или не знали об этом?)

Цитирую пост Ласека:

В любом случае, вот как работает скрипт.

Это в основном две подстановки регулярных выражений и одна транслитерация. Проникновение чего-либо в стандартный ввод не имеет значения, perl код не использует свой ввод в любом случае. Если вы разделите длинную линию на Границы выражений, вы получите это:

$??s:;s:s;;$?::
s;;=]=>%-{\\>%<-{;;
y; -/:-@[-`{-};`-{/" -;;
s;;$_;see

Первая строка - это условие, которое ничего не делает, кроме как делает код выглядеть сложнее. Если предыдущая команда произошла из Perl код не был успешным, он делает некоторые замены на стандарт вход (который программа не использует, поэтому эффективно заменяет ничто). Поскольку никакой предыдущей команды не существует, $? всегда 0, поэтому первая строка никогда не выполняется.

Вторая строка заменяет стандартный ввод (ничего) для, казалось бы, бессмысленного мусора.

Третья строка - оператор транслитерации. Он определяет 4 диапазона, в которые персонажи заменяются на один диапазон и 4 символы, указанные в замене транслитерации. Я бы предпочел не напишите здесь всю таблицу транслитерации, потому что она немного длинная. Если вы действительно заинтересованы, просто напишите символы в определенном диапазоны (пробел до '/', ':' до '@', '[' до '(backtick)' и '{' до '}') и напишите рядом с ними символы из диапазона замены ('(backtick)' в '{') и, наконец, напишите оставшиеся символы (/, ", пробел и -) из шаблона замены. Когда у вас есть эта таблица, вы можете увидеть какой персонаж заменяется на какой.

Последняя строка выполняет результирующая команда путем подстановки ничего с полученной строкой (который является 'xterm'. Первоначально это был 'system' rm -rf / '', и он в $ _), оценивает подстановку как выражение и выполняет ее.

(я заменил 'backtick' на фактический символ backtick здесь, чтобы код не автоматически включался.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...