Как импортировать EXPORT_TAGS в EXPORTS_OK? - PullRequest
0 голосов
/ 26 марта 2019

Пытаясь сгруппировать экспорт моего модуля, используя теги, я хочу избежать перечисления имен более одного раза, поэтому я попробовал это:

our %EXPORT_TAGS = (
    'command_types' => [qw(ENQ ACK NAK)],
    'commands' => [qw(A B C)],
    'status_codes' => [qw(OK FAILED)],
    'default' => [
        qw(:status_codes :command_types :status_codes)
    ]);
our @EXPORT = @{$EXPORT_TAGS{':default'}};
our @EXPORT_OK = @{$EXPORT_TAGS{':default'}};

Но, к сожалению, Perl 5.18 говорит мне что-то о неопределенной ссылке на массив для @{$EXPORT_TAGS{':default'}} (" Невозможно использовать неопределенное значение в качестве ссылки на массив ..."). Однако, когда я удаляю внешний @{...}, Perl больше не жалуется, но результат (ссылка на массив вместо массива) неверен.

Что я пропустил?

Обновление:

Когда я удаляю двоеточия из :default, сообщение об ошибке исчезает, но затем я получаю сообщение об ошибке Can't export symbol: :command_types. Если я удаляю двоеточие из :command_types, я больше не получаю сообщение об ошибке (на данный момент), но не попытается ли это экспортировать символ с именем command_types вместо всех символов для тега command_types

Эффективный результат равен @EXPORT = qw(status_codes command_types status_codes).

1 Ответ

2 голосов
/ 26 марта 2019

Согласно документации , вы не должны включать начальные двоеточия для имен тегов в хэш %EXPORT_TAGS.

Так что вы также можете попробовать что-то вроде этого:

our %EXPORT_TAGS = (
    'command_types' => [qw(ENQ ACK NAK)],
    'commands' => [qw(A B C)],
    'status_codes' => [qw(OK FAILED)],
);
my @default_tags = qw(status_codes command_types commands);
my @default;
push @default, @{$EXPORT_TAGS{$_}} for @default_tags;
our @EXPORT = @default;
our @EXPORT_OK = @default;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...