Perl Exporter 在子类中使用来自@EXPORT_OK 的变量

标签 perl perl-exporter

过去几个小时我一直在寻找,但我被难住了。

我确实看到了 How can I share variables between a base class and subclass in Perl?但它没有回答我的问题

我正在尝试编写一个实用程序模块(此时用于测试目的)以用于内部开发的脚本。但我似乎很难让导出商实际导出我需要的东西。

我有以下内容:

lib/Internal.pm:

package Internal;

use     5.008_008;
use     strict;
use     warnings;
use     Exporter;

our $VERSION = 1;
our @EXPORT_OK = qw($EMPTY $NOW);
our %EXPORT_TAGS = ( ':all' => \@EXPORT_OK );

our $EMPTY = q{};
our $NOW = time;

1;

lib/Internal/Utility.pm:

package Internal::Utility;

use     5.008_008;
use     strict;
use     warnings;
use     FindBin::libs;
use     parent qw(Internal);
use     Data::Dumper;

our $VERSION = 1;
our @EXPORT_OK = qw(run);
our %EXPORT_TAGS = ( ':all' => \@EXPORT_OK );

sub run
{
    print Dumper $NOW;
    print Dumper $EMPTY;
    exit;
}

1;

bin/test.pl:

#!/usr/bin/env perl

use     5.008_008;
use     strict;
use     warnings;
use     FindBin::libs;
use     Internal::Utility qw(:all);

run();
exit;

当我运行 test.pl 时,出现以下错误:

Global symbol "$NOW" requires explicit package name at lib/Internal/Utility.pm line 8.
Global symbol "$EMPTY" requires explicit package name at lib/Internal/Utility.pm line 9.
Compilation failed in require at ./test.pl line 7.
BEGIN failed--compilation aborted at ./test.pl line 7.

为什么 Internal::Utility 中的 use parent 没有从 Internal.pm 导入变量?有没有办法告诉 use parent 显式导入一些变量?

最佳答案

在 Perl 中,继承只会影响方法调用 的解析方式。其他所有内容(变量、子例程等)都保持不变。

这意味着您应该将这些符号导入您的派生类,就像您从任何其他模块导入一样:

package Internal::Utility;
...
use Internal ':all';
use parent qw(Internal);
...

Perl 使用包作为其唯一的命名空间机制,但包也可以用作类。这可能有点令人困惑。作为一般建议,您永远不应该混合这两者:一个包应该提供一个面向对象的接口(interface)或一个基于导出器的过程接口(interface)。将两者混合往往会导致误导性设计。

关于Perl Exporter 在子类中使用来自@EXPORT_OK 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47803493/

相关文章:

perl - 在 Perl 中查找空白索引

perl - 如何在 perl 的本地范围内访问导入模块中的变量?

perl - 在 Perl 中,为什么我需要 Exporter?

perl - 从 Perl 模块导出所有常量(只读变量)的最有效方法是什么

linux - 使用 Perl 的 telnet 连接出现 "pattern match read eof"错误

linux - 如何使用 CGI 和 Perl 的 Net::OpenSSH 模块在远程 Linux 服务器上执行系统命令?

xml - 用 perl 和 libXML 解析 xml

mysql - Perl DBI(MySQL)在准备好的语句中放置单引号而不是实际参数

perl - 如何有条件地从另一个模块导入函数并将它们导出到本地命名空间