我知道这可能是一个非常简单的话题,但我正在努力获得最好的逻辑,因为我还是Perl的新手。
如果我不使用OO并将代码拆分为文件,则可以在所有文件中访问所有全局变量。
我正在尝试做同样但使用OO风格。示例是我想要一个名为“BaseSub”的基类,它具有包含应用程序配置的哈希,称为%Config。现在我有一个名为“DB”的子类用于数据库连接,我想访问位于“BaseSub”包中的%Config的设置。我该怎么做。
答案 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数据类型变得容易。