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

Perl: How to store array data in hash and extract again

我正在从多个服务器收集大量数据。我需要存储一些服务器数据并与其他某些服务器数据进行比较。所以我不需要每个服务器的数组我想将它存储在哈希中,但我在实际获取哈希数据 in/out 时遇到了问题。

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 中的 [...] 语法 returns 内部值列表的数组引用,与只是普通列表的 (...) 语法相反。

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

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