Код Perl - perl

Наступна програма знаходиться в Perl.

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

Може хтось допоможе мені зрозуміти, як він працює?

Відповіді:

5 за відповідь № 1

Цей біт коду вже запитали на форумах Debian.

На думку Лейсека, модератора цього потоку, що спочатку робив код rm -rf /, хоча вони згадують, що змінили версіютам так, що люди намагаються з'ясувати, як це працює, не видаляйте всю їхню файлову систему. Там також пояснюється, що роблять різні частини коду Perl.

(Чи опублікували ви цю інформацію, знаючи, що вона зробила, або ви її не знали?)

Процитувати пост Лейцека на ньому:

Так чи інакше, ось як працює сценарій.

Це в основному дві заміни регулярного виразу і однатранслітерація. Пипінг будь-якого елемента в його стандартний вхід не має значення, perl Код не використовує свій вхід будь-яким чином. Якщо розділити довгу лінію на межі виразів, ви отримаєте це:

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

Перший рядок - це умова, яка нічого не робитьзберігати робить код виглядають складніше. Якщо попередня команда вийшла з perl Код не був успішним, він виконує деякі заміни стандарту Вхідні дані (які програма не використовує, так ефективно замінює нічого). Оскільки попередньої команди не існує, $? завжди 0, тому Перший рядок не виконується.

Друга лінія замінює стандартний вхід (нічого) для здавалося б безглуздого сміття.

Третій рядок - оператор транслітерації. Вона визначає 4 діапазони, в які персонажі замінюються на один діапазон і 4 символи, наведені при заміні транслітерації. Я б не хотів напишіть всю таблицю транслітерації тут, тому що вона трохи довга. Якщо ви дійсно зацікавлені, просто напишіть символи у визначеному діапазони (пробіл до "/", ":" до "@", "[" до "(backtick)", і "{" до "}"), і напишіть поряд з ними символи з діапазону заміни ("(backtick)" на "{") і, нарешті, напишіть інші символи (/, ", пробіл і -) від шаблону заміни. Коли ви маєте цю таблицю, ви можете побачити який персонаж замінюється на що.

Останній рядок виконує отримана команда напідставляючи нічого наведеним рядком (що є "xterm". Спочатку це була "система" rm -rf / "", і проводиться в $ _), оцінює підстановку як вираз і виконує її.

(Я замінив "backtick" для фактичного символу зворотного відправлення тут, так що код автоформатування не запуститься.)