过去几个小时我一直在寻找,但我被难住了。
我确实看到了 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/