Perl: Как хранить данные массива в хэше и снова извлекать

#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}};