Как работает следующий 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
который выдает ошибку