нерешенный вопрос - PullRequest
       8

нерешенный вопрос

4 голосов
/ 20 августа 2011

В примере в Модули perlmod / Perl есть блок BEGIN.Я посмотрел на некоторые модули, но ни один из них не имел блока BEGIN.Должен ли я использовать такой блок BEGIN при написании модуля или это просто?

Ответы [ 2 ]

8 голосов
/ 20 августа 2011

Блок 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;
2 голосов
/ 20 августа 2011

Блок BEGIN в модуле полностью необязателен. Вы используете его, только если есть что-то, что должно быть сделано вашим модулем, когда он загружен, прежде чем он будет использован. На этом этапе редко есть причины делать многое, поэтому редко есть причины использовать блок BEGIN.

...