Perl:如何将数组数据存储在散列中并再次提取



我正在从多个服务器收集一堆数据。我需要存储一些服务器数据,并与其他特定的服务器数据进行比较。因此,我不需要每个服务器都有一个数组,我想将其存储在哈希中,但我在实际将数据放入/取出哈希时遇到了问题。

foreach my $cluster_type (sort keys %{$href_server_list}){
foreach my $server (sort @{$href_server_list->{$cluster_type}}){
my @a_cmd_results = ();
get_server_data(@a_cmd_results,$server);
if($cluster_type eq "TYPEA"){
push @{$GLOBAL_HASH_TYPEA_DATA{$server}}, @a_cmd_results;
}
elsif($cluster_type eq "TYPEB"){
push @{$GLOBAL_HASH_TYPEB_DATA{$server}}, @a_cmd_results;
}

my @TYPEA;
my @TYPEB;
my $server;
#loop through the 4 different servers
for(my $i=0;$i<4;$i++){
$server=$TYPEA_keys[$i];
push @TYPEA, @{$GLOBAL_HASH_TYPEA_DATA{$server}};#error here, "Cant use an undefined value as an ARRAY reference
$server=$TYPEB_keys[$i];
push @TYPEB, @{$GLOBAL_HASH_TYPEB_DATA{$server}};
#sort and compare data from TYPEA and TYPEB
}

它";作品";如果我推送一个引用而不是像这个那样的数组

push @{$GLOBAL_HASH_TYPEA_DATA{$server}}, @a_cmd_results;

但是,如果它只是引用数组@a_cmd_results,那就没有好处了,因为它会不断地为每个服务器重复使用,并且只包含最后一个服务器?

您应该使用@a_cmd_results的内容在适当的位置构建一个新的数组引用,如下所示:

push@{$GLOBAL_HASH_TYPEA_DATA{$server}},[@a_cmd_results];

Perl中的[...]语法返回内部值列表的数组引用,而(...)语法只是一个普通列表。

推送似乎是个问题。虽然简单地尝试分配一个等于数组的值通常会给出它的长度,但方括号会改变这一点。因此,解决方案如下

$GLOBAL_HASH_TYPEA_DATA{$server} = [@a_cmd_results];
my @TYPEA = @{$GLOBAL_HASH_TYPEA_DATA{$server}};

最新更新