Разместить здесь вашу рекламу


Хитрый Perl-квайн

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Прим. пер.: Встретил сегодня в твиттере очень забавный, на первый взгляд, тред. А потом пригляделся и понял, что он не только забавный, но и занятный. А раз уж так сложилось, что сегодня пятница, то решил, что стоит поделиться обнаруженным и с товарищами:)

image

Сохраните следующую программу в /tmp/quine.pl

Illegal division by zero at /tmp/quine.pl line 1.

Запустите её командой
perl /tmp/quine.pl
и она выведет свой собственный код.

«Квайны-обманки» довольно просто сочинять на многих языках программирования, где ошибка синтаксиса в исходнике провоцирует парсер на вывод ошибки, которая бы совпадала с исходным текстом программы. Я опубликовал несколько подобных «обманок» у себя в Twitter, включая следующую:

  File "quine.py", line 1
    File "quine.py", line 1
   ^
IndentationError: unexpected indent

Но перловый квайн в начале этой заметки — это обманка совершенно другого рода — программа разбирается корректно. И недолго работает, пока не спотыкается об ошибку деления на ноль. Этот квайн очень чувствителен к именованию файла — например, запуск через ./quine.pl не сработает.

Так это сообщение об ошибке — на самом деле целая программа?!
В этой программе используется многое из перлового делай-что-я-имею-ввиду-парсера.

Символ / очень зависим от контекста применения и может быть расценен как символ деления, либо как начало регулярного выражения. И даже небольшие изменения в коде этой программы приводят к ошибке разбора регулярки, а не к выполнению кода. В данном случае оба символа / появляются в контексте оператора.

Другие несловарные части этой программы это 1., который интерпретируется просто как число и . которая является оператором конкатенации.

Тогда что же значат слова?

Слова в Perl могут быть именами подпрограмм, методов, пакетов или классов. Или же (в нестрогом режиме) строками без разделителя или может даже чем-то ещё, о чём я позабыл!

В Perl также применяется необычный синтаксис вызова методов, называемый "непрямым синтаксисом объекта", который выглядит следующим образом:

метод объект аргументы
чаще всего можно видеть как

print $filehandle "message";
my $instance = new Class(args);

хотя для Perl более предпочтителен следующий синтаксис:

$filehandle->print("message");
my $instance = Class->new(args);

В документации perlobj говорится:

Для разбора этого кода Perl использует эвристики, основанные на том, какие имена пакетов ему известны, какие в текущем пакете существуют подпрограммы, какие слова он до этого встречал и анализируя другие вводные данные. Излишне говорить, что эвристика может давать очень неожиданные результаты!


Как он разбирает этот код?
Начиная с правой стороны,

pl line 1.

разбирается как вызов метода

line->pl(1.)

где line — это имя пакета (класса), а pl — это метод.

В середине «at», «tmp» и «quine» разбираются как простые слова, т.е. строки. Выражение разбирается следующим образом:

(("at" / "tmp") / "quine") . line->pl(1.)

Слева находятся два сложенных непрямых вызова метода,

division->Illegal(zero->by( ... ))

внутреннее выражение, выполняющееся первым, это:

"at" / "tmp"

И это мгновенно вызывает исключение деления на ноль.
Источник: https://habr.com/ru/company/itsumma/blog/446958/


Интересные статьи

Интересные статьи

Одна из самых важных (на мой взгляд) функций в Битрикс24 это бизнес-процессы. Теоретически они позволяют вам полностью избавиться от бумажных служебок и перенести их в эл...
Однажды, в понедельник, мне пришла в голову мысль — "а покопаюсь ка я в новом ядре" (новым относительно, но об этом позже). Мысль не появилась на ровном месте, а предпосылками для нее стали: ...
Есть статьи о недостатках Битрикса, которые написаны программистами. Недостатки, описанные в них рядовому пользователю безразличны, ведь он не собирается ничего программировать.
Несмотря на то, что “в коробке” с Битриксом уже идут модули как для SOAP (модуль “Веб сервисы” в редакции “Бизнес” и старше), так и для REST (модуль “Rest API” во всех редакциях, начиная с...
Бизнес-смыслы появились в Битриксе в начале 2016 года, но мало кто понимает, как их правильно использовать для удобной настройки интернет-магазинов.