Perl与子类共享变量

时间:2014-02-25 20:21:56

标签: perl

我知道这可能是一个非常简单的话题,但我正在努力获得最好的逻辑,因为我还是Perl的新手。

如果我不使用OO并将代码拆分为文件,则可以在所有文件中访问所有全局变量。

我正在尝试做同样但使用OO风格。示例是我想要一个名为“BaseSub”的基类,它具有包含应用程序配置的哈希,称为%Config。现在我有一个名为“DB”的子类用于数据库连接,我想访问位于“BaseSub”包中的%Config的设置。我该怎么做。

2 个答案:

答案 0 :(得分:3)

使用其全名。

for (keys(%BaseSub::Config)) {
    print("$_: $BaseSub::Config{$_}\n");
}

你也可以导入它。

our %Config; *Config = \%BaseSub::Config;

for (keys(%Config)) {
    print("$_: $Config{$_}\n");
}

答案 1 :(得分:3)

如果你在这个时代写作OO perl,你真的应该使用Moose。它使OO代码更容易,更清晰,更小。

继承变量的正确方法是创建对象属性。这是一个简单的例子:

package MyBaseClass;

use Moose; 

has config => (
    is => 'ro',
    default => sub { {
        who => 'World',
    } }
);

package MyClass;

use Moose;

extends qw(MyBaseClass);

sub greet
{
    my $self = shift;
    printf("Hello %s!\n", $self->config->{who});
}

package main;

my $object = MyClass->new();

$object->greet();

了解Moose的一个很好的起点是Moose::Manual

修改

如果您希望能够修改配置,您可以直接戳取配置访问器返回的hashref:

$object->config->{who} = 'Friends';

但更好的方法可能是创建一个配置类并使config属性保存一个实例:

package Myconfig;

use Moose;

has who => (is => 'rw', default => 'World');

package MyBaseClass;

use Moose;

has config => (
    is => 'ro',
    isa => 'MyConfig',
    default => sub { MyConfig->new },
);

# inherit, instantiate, etc as before...

$object->config->who('Friends');

另一种方法可能是Moose::Meta::Attribute::Native::Trait::Hash,这使得设置辅助方法以使用本机Perl数据类型变得容易。