首页 > 解决方案 > 如何将 EXPORT_TAGS 导入 EXPORTS_OK?

问题描述

尝试使用标签对我的模块导出进行分组,我想避免多次列出名称,所以我尝试了这个:

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'}}(“不能使用未定义值作为数组引用...”)。但是,当我删除 external 时@{...},Perl 不再抱怨,但结果(数组引用而不是数组)是错误的。

我错过了什么?

更新:

当我从 中删除冒号时:default,错误消息消失,但随后我收到关于Can't export symbol: :command_types. 如果我从中删除冒号,:command_types我不会再收到错误(此时),但是这不会尝试导出一个名为而不是所有符号command_types的符号 tagcommand_types吗?

结果是有效的@EXPORT = qw(status_codes command_types status_codes)

标签: perlmodule

解决方案


根据文档%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;

推荐阅读