在工作中,我们喜欢将参数作为哈希引用传递给子例程:
my $manager = DatabaseManager->new({
'sHost' => 'my_host',
'sDatabase' => 'some_database'
});
对象本身有一个如下所示的init函数:
sub _init
{
my ($self, $phArgs) = @_;
$self->{_sHost} = $phArgs->{sHost};
$self->{_sDatabase} = $phArgs->{sDatabase};
}
有没有办法整理一下?即使只是第一行可以更清楚,我认为这是一个改进。像
这样的东西sub _init
{
my ($self, ($host, $database) ) = @_;
$self->{_sHost} = $host;
$self->{_sDatabase} = $database;
}
然后很清楚子程序需要什么。有什么想法吗?
答案 0 :(得分:5)
好像你想要“命名”选项。你可以这样做:
my ($self, $phArgs) = @_;
my ($sHost, $sDatabase) = @{$phArgs}{qw( sHost sDatabase )};
但是你最后提到sHost
和sDatabase
四次,因为你跟进了
$self->{_sHost} = $sHost;
$self->{_sDatabase} = $sDatabase;
你无能为力,因为那是你想要的。我认为这很疯狂,因为整个潜艇可以写成:
my ($self, $phArgs) = @_;
@$self{qw( _sHost sDatabase )} = @$phArgs{qw( sHost sDatabase )};
或
my ($self, $phArgs) = @_;
$self->{"_".$_} = $phArgs->{$_} for qw( sHost sDatabase );