Блок BEGIN
нужен только в том случае, если вам нужно выполнить какой-то код при времени компиляции против времени выполнения .
Пример. Предположим, у вас естьмодуль Foo.pm
в нестандартном каталоге библиотеки (например, /tmp
).Вы знаете, что Perl может найти модуль, изменив @INC
, чтобы включить /tmp
.Однако это не сработает:
unshift(@INC, '/tmp');
use Foo; # perl reports Foo.pm not found
Проблема в том, что оператор use
выполняется во время компиляции, тогда как оператор unshift
выполняется во время выполнения, поэтому, когда perl ищет Foo.pm
, путь включения не был изменен (пока).
Правильный способ сделать это:
BEGIN { unshift(@INC, '/tmp') };
use Foo;
Теперь оператор unshift
выполняется во время компиляции и дооператор use Foo
.
Подавляющему большинству сценариев не требуется блоков BEGIN
.Многое из того, что вам нужно в BEGIN
блоках, может быть получено через use
-ing других модулей.Например, в этом случае мы можем убедиться, что /tmp
находится в @INC
, используя модуль lib.pm
:
use lib '/tmp';
use Foo;