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}};
我正在从多个服务器收集大量数据。我需要存储一些服务器数据并与其他某些服务器数据进行比较。所以我不需要每个服务器的数组我想将它存储在哈希中,但我在实际获取哈希数据 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}};