gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:17:34 26 4
gpt4 key购买 nike

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

我确实看到了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com