在Perl中将哈希转换为数组

时间:2018-07-30 09:35:16

标签: arrays perl hash

我想将此代码从使用散列更改为数组,但是我找不到继续进行下去的好例子。有人可以建议吗?到目前为止,我唯一的暗示是在第2行中使用[ ]

my @subscriptions    = ();
$self->{'serverMap'} = {};

foreach my $service( "pmservice", "saservice" ) {

    my $r_serverMap = enmGetServiceGroupInstances($self->{'site'}, $self->{'date'}, $service);

    while ( my ($server, $serverId) = each %{$r_serverMap} ) {
        push ( @subscriptions, {'server' => $server, 'prog' => 'JBOSS'} );
        $self->{'serverMap'}->{$server} = $serverId;
    }
}

return \@subscriptions;

2 个答案:

答案 0 :(得分:3)

首先,这两个任务是不必要的:

my @subscriptions    = ();
$self->{'serverMap'} = {};

第一个不执行任何操作,第二个不执行任何操作。当您使用

声明数组时
my @subscriptions;

然后将其创建为空。在定义中添加= ()不会带来任何效果。

并显式设置$self->{'serverMap'}为空的匿名哈希是没有用的。当您开始将数据放入$self->{'serverMap'}时,可以决定数据应采用的格式。

第二,您说要用数组替换哈希。我假设您要替换的是$self->{'serverMap'}中当前存储的哈希。这很容易。只需替换该行:

$self->{'serverMap'}->{$server} = $serverId;

使用

push @{ $self->{'serverMap'}->{$server} }, $serverId;

事实上,让我们同时消除所有不必要的标点符号:

push @{ $self->{serverMap}{$server} }, $serverId;

就完成了。最初,$self->{'serverMap'}包含对哈希的引用,现在它包含对数组的引用。

当然,那只是工作的一半。现在,您将数据存储为数组,但还需要将数据存储为数组。您将在代码中的某个位置查看$self->{'serverMap'}中的数据-现在也需要更改该数据,否则您的程序将停止工作。

答案 1 :(得分:0)

相同,但看起来较短

my @subscriptions;
foreach my $service( "pmservice", "saservice" ) {
    $self->{serverMap} = enmGetServiceGroupInstances($self->{'site'}, $self->{'date'}, $service);

    push @subscriptions, map {
        +{ server => $_, prog => 'JBOSS' }
    } keys %{ $self->{'serverMap'} };
}