我想将此代码从使用散列更改为数组,但是我找不到继续进行下去的好例子。有人可以建议吗?到目前为止,我唯一的暗示是在第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;
答案 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'} };
}