Вам нужно выполнить import
, прежде чем ссылка на константу будет скомпилирована.
Вы можете использовать для этого еще один блок BEGIN
, но это означает, что у нас теперь два хака.Вместо откровенного определения пользователя модуля и самого модуля, я предлагаю следующий подход.Это позволяет встроенному пакету выглядеть как можно реальным модулем.
Подход состоит в следующем:
- Поместите весь модуль как есть в блок
BEGIN
в начале сценария. - Заменить завершающий
1;
на $INC{"Foo/Bar.pm"} = 1;
(для Foo::Bar
).
Вот и все.Это позволяет вам use
модуль как обычно.
Так что, если ваш модуль имеет следующий вид:
package Test;
use strict;
use warnings;
use Exporter qw( import );
our $VERSION = 1.00;
our @EXPORT_OK = qw(AR);
use constant AR => [1,2,3];
1;
И если ваш скрипт следующий:
#!/usr/bin/perl
use 5.018;
use warnings;
use Test qw( AR );
say AR->[1];
Вы можете использовать следующее:
#!/usr/bin/perl
BEGIN {
package Test;
use strict;
use warnings;
use Exporter qw( import );
our $VERSION = 1.00;
our @EXPORT_OK = qw(AR);
use constant AR => [1,2,3];
$INC{__PACKAGE__ .'.pm'} = 1; # Tell Perl the module is already loaded.
}
use 5.018;
use warnings;
use Test qw( AR );
say AR->[1];
Как видите, я сделал некоторые очистки.В частности,
- Если вам требуется 5.18, возможно, также включите предоставляемые языковые функции.Это было сделано путем замены
required 5.018;
на use 5.018;
- Нам не нужно явно использовать
use strict;
, потому что use 5.012;
и более высокие стриктуры включения. - Мы можем использовать
say
потому что use 5.010;
включает его.
- Тест не является экспортером, поэтому он не должен наследоваться от экспортера.В течение последних 15-20 лет Exporter предоставляет лучший интерфейс, чем тот, который вы использовали.
- Нет необходимости создавать или инициализировать
@EXPORT
, если он вам не нужен. - Нет необходимости в блоке
BEGIN
для инициализации @ISA
и @EXPORT_OK
.