Однажды программист прочитал, что константы в Perl-е можно делать из функций, которые возвращают константное выражение. Программист решил попробовать:
Программа работала, но результат программисту не понравился. Почему так получилось?
Зоологическое примечание: муравьи – насекомые, у всех насекомых по 6 ног. См. муравьи и насекомые в энциклопедиях. Так что у одного муравья 6 ног, а у 7 муравьев 42 ноги.
А еще программист попробовал сделать так:
И получил ошибку компиляции: Can’t use string (“1”) as a symbol ref while “strict refs” in use at ants.pl line 2.
###Подсказка-3
Показать
А если так?
sub AN_ANT_LEGS() { 6 };
В первоначальном варианте функция AN_ANT_LEGS захватывает следующую за ней * 7
как параметр.
* 7
– это ссылка на глоб с именем 7
.
Параметр в функции не используется, и возвращается все равно 6
.
Поэтому программа печатала
Аналогичная проблема была в программе с циклом.
В Подсказке-3 функция объявлена с пустым прототипом, никаких параметров не захватывает, и работает ожидаемым образом. Именно так и делается в модуле constant.pm: создаются функции с пустым прототипом, возвращающие константы.
Мораль: лучше бы программист пользовался прагмой constant