3

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

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

那么子程序需要什么就很清楚了。有任何想法吗?

4

1 回答 1

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 );
于 2013-06-21T19:08:06.730 回答