Этот вопрос требует понимания фазы компилятора, против блока BEGIN
. Из Программирование Perl: 3-е издание - Страница 467
Также важно понимать разницу между фазой компиляции и временем компиляции, а также между фазой запуска и временем выполнения. Типичная Perl программа получает одну фазу компиляции, а затем одну фазу запуска. «Фаза» - это масштабная концепция. Но время компиляции и время выполнения - это небольшие концепции. Данная фаза компиляции выполняет в основном вещи во время компиляции, но она также выполняет некоторые вещи во время выполнения через блоки BEGIN
. Данная фаза запуска в основном выполняет вещи во время выполнения, но она может выполнять вещи во время компиляции с помощью таких операторов, как eval STRING
.
Давайте рассмотрим очень простой пример
sub complex_sub {
die 'code run';
}
sleep 5;
print 'good';
use constant FOO => complex_sub();
если вышеописанное выполняется как есть, то complex_sub
с точки зрения пользователя запускается на этапе компиляции. Тем не менее, с небольшими изменениями я могу иметь ..
# Bar.pm
package Bar {
use constant FOO => main::complex_sub();
}
# test.pl
package main {
sub complex_sub {
die 'code run';
}
sleep 5;
print 'good';
require Bar;
}
В приведенном выше коде complex_sub
выполняется в фазе выполнения. В любом случае можно ли дифференцировать эти два случая с точки зрения complex_sub
, чтобы включить верхний синтаксис, но запретить нижний синтаксис.