#arrays #perl #hash
Вопрос:
Я собираю кучу данных с нескольких серверов. Мне нужно сохранить некоторые данные сервера и сравнить их с другими определенными данными сервера. Поэтому мне не нужен массив для каждого сервера, который я хотел бы сохранить в хэше, но у меня возникли проблемы с фактическим вводом/выводом данных из хэша.
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, то это никуда не годится, потому что он постоянно используется повторно для каждого сервера и будет содержать только последний сервер?
Ответ №1:
Вы должны создать новую ссылку на массив на месте , используя содержимое @a_cmd_results
, как это:
нажмите @{$GLOBAL_HASH_TYPEA_DATA{$сервер}}, [@a_cmd_results];
[...]
Синтаксис в Perl возвращает ссылку на массив для списка значений внутри, в отличие от (...)
синтаксиса, который представляет собой простой список.
Комментарии:
1. Похоже, что теперь в нем хранится адрес данных, и мое сравнение не удается. Значения, которые помещаются в @TYPEA[0] = «МАССИВ(0x2668508), и нет @TYPEA[1].
Ответ №2:
Похоже, что толчок был проблемой. В то время как простая попытка присвоить массиву что-то равное, как правило, дает вам его длину, квадратные скобки изменяют это. Таким образом, решение было следующим
$GLOBAL_HASH_TYPEA_DATA{$server} = [@a_cmd_results];
my @TYPEA = @{$GLOBAL_HASH_TYPEA_DATA{$server}};