如何编写可读的子程序哈希参数?

时间:2013-06-21 19:02:41

标签: perl

在工作中,我们喜欢将参数作为哈希引用传递给子例程:

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;
}

然后很清楚子程序需要什么。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

好像你想要“命名”选项。你可以这样做:

my ($self, $phArgs) = @_;
my ($sHost, $sDatabase) = @{$phArgs}{qw( sHost sDatabase )};

但是你最后提到sHostsDatabase四次,因为你跟进了

$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 );