Как работает следующий quine?

Согласно википедии:

Quine - это непустая компьютерная программа, которая не требует ввода и выдает копию своего собственного исходного кода в качестве единственного вывода.

Я видел этот фрагмент кода на Perl и не могу понять, как он работает.

Сохраните следующую строку в файле /tmp/p и запустите файл как perl /tmp/p:

Illegal division by zero at /tmp/p line 1.

Выходные данные perl /tmp/p:

Illegal division by zero at /tmp/p line 1.

Как работает код?

2 ответа

Решение

Сначала попробуйте запустить его с включенными предупреждениями:

$ perl -wp
Строка без кавычек "at" может конфликтовать с будущим зарезервированным словом в p строке 1.
Строка без кавычек "tmp" может конфликтовать с будущим зарезервированным словом в p строке 1.
Аргумент "tmp" не является числовым в делении (/) в строке p.
Аргумент "at" не является числовым в делении (/) в строке p.

Первые два предупреждения относятся к фазе компиляции.

Давайте посмотрим на Deparse выход:

$ perl -MO = Deparse p
'Division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));
p синтаксис ОК

По сути, значение at деленное на tmp делится на возвращаемое значение другого вызова методаp передается в качестве аргумента методу by вызывается в классе 'zero', at а также tmp считаются строками, а их числовые значения равны нулю. Следовательно, at/tmp приводит к неправильному делению на ноль ошибок.

Вы получите ту же ошибку, если вы измените содержимое файла на

Stackru hacker news one at /tmp/p line 1.

Если вам интересно, как Illegal division становится 'division'->Illegalсмотрите косвенный синтаксис объекта и избегайте его использования.

Я бы предпочел, чтобы вы сконцентрировались на улучшении качества вашего Perl-кода, а не на изучении неясных углов

Но ответ в том, что строка анализируется как

'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));

и Perl использует ноль для 'at' а также 'tmp' потому что они не являются допустимыми числовыми строками, поэтому первое действие заключается в оценке 0 / 0 который выдает ошибку

Другие вопросы по тегам