Вы пробовали заменить блок BEGIN{}
на блок INIT{}
?Это стандартный подход для таких вещей, как modperl, в которых используется модель «один раз при компиляции», так как вам нужно заново инициализировать вещи при каждом отдельном запуске, а не только один раз во время компиляции.
Но у меня естьспросить, почему все это в специальном блоке в любом случае.Почему бы вам просто не сделать какую-то функцию prepare_db_connection()
, а затем вызывать ее по мере необходимости при запуске программы?
Что-то, что не будет работать в BEGIN{}
, также будет иметьта же проблема, если это основной код в файле модуля, который получает use
d.Это еще одна возможная причина для использования блока INIT{}
.
Я также видел смертельно опасные проблемы взаимной рекурсии, которые нужно решать, используя что-то вроде require
вместо use
илиINIT{}
вместо BEGIN{}
.Но это довольно редко.
Рассмотрим эту программу:
% cat sto-INIT-eg
#!/usr/bin/perl -l
print " PRINT: main running";
die " DIE: main dying\n";
die "DIE XXX /* NOTREACHED */";
END { print "1st END: done running" }
CHECK { print "1st CHECK: done compiling" }
INIT { print "1st INIT: started running" }
END { print "2nd END: done running" }
BEGIN { print "1st BEGIN: still compiling" }
INIT { print "2nd INIT: started running" }
BEGIN { print "2nd BEGIN: still compiling" }
CHECK { print "2nd CHECK: done compiling" }
END { print "3rd END: done running" }
Только при компиляции выдает:
% perl -c sto-INIT-eg
1st BEGIN: still compiling
2nd BEGIN: still compiling
2nd CHECK: done compiling
1st CHECK: done compiling
sto-INIT-eg syntax OK
При компиляции и выполняется, это выдает:
% perl sto-INIT-eg
1st BEGIN: still compiling
2nd BEGIN: still compiling
2nd CHECK: done compiling
1st CHECK: done compiling
1st INIT: started running
2nd INIT: started running
PRINT: main running
DIE: main dying
3rd END: done running
2nd END: done running
1st END: done running
И оболочка сообщает о выходе 255, за die
.
Вы должны быть в состоянии организовать соединение, когда вам нужнодаже если BEGIN{}
окажется слишком рано.
Хм, только что вспомнил.Нет шансов, что вы что-то делаете с DATA
в BEGIN{}
, не так ли?Это не настроено, пока не работает переводчик;он не открыт для компилятора.