Третий Perl вопрос от меня через два дня. Некоторые скажут, что я недостаточно усердно занимаюсь исследованиями, хотя скажу, что помогаю поддерживать активную секцию: P В любом случае, я громко размышляю в надежде, что мне ответят.
Без лишних слов позвольте мне процитировать утверждение из константы документации прагмы:
Когда в выражении используется константа, Perl заменяет ее на
значение во время компиляции, а затем может дополнительно оптимизировать выражение.
Я просто хочу пояснить: означает ли это, что все выражения оцениваются только один раз за выполнение программы? Потому что это также говорит о том, что они построены с использованием встроенных сабвуферов, что само по себе кажется мне оценочным для использования. Я имею в виду, если вы получаете подпрограмму, которая возвращает выражение, она переоценивает его за вызов, верно? Если они не используют вложенные переменные или переменные состояния для оценки только один раз, но я не знаю.
Конечно, могу ли я гарантировать, что это будет оцениваться только один раз?
#!/usr/bin/perl
use 5.014;
use autodie;
use strict;
use warnings;
use constant TEST => do {
say 'Testing...';
5;
};
say TEST foreach (1..4);
Кажется, в этом конкретном примере я могу; «Тестирование ...» печатается только один раз. Но гарантировано ли это для всех выражений, которые я к ним добавляю?
Да, да, да. Я должен использовать Readonly на CPAN. К сожалению, я пришел из серии мыслей Python, что вы должны придерживаться стандартного способа сделать что-то как можно больше, поэтому я придерживаюсь устаревшей константы , потому что это основная прагма.
В принципе, если я добавлю длинный сложный конвейер sort / grep / map в константу, могу ли я на 100% гарантировать только одну оценку?