Как отследить исходную информацию о структуре данных из дампа PERL? - PullRequest
1 голос
/ 19 марта 2020

Я работаю над анализом нескольких листов .xlsx, чтобы создать новый лист с условным использованием данных. Я прошел через следующую структуру данных и не понял, является ли это массивом хэшей или хэшем хэшей. Я вывел следующую структуру данных с помощью команды dump:

print Dumper $ hash_reg_list {first_type} {registers};

            [
          {
            'fields' => [
                          {
                            'field_name' => ' IP_NAME_AACTV_SFE'
                          },
                          {
                            'field_name' => ' IP_NAME_AACTV_PP'
                          },

                        ],
            'register_name' => ' IP_NAME_AACTV'
          },
          {
            'fields' => [
                          {
                            'field_name' => ' IP_NAME_CONFIG_LO_KHD_L2DEMOTE'
                          }
                        ],
            'register_name' => ' IP_NAME_CONFIG'
          },
          {
            'fields' => [
                          {
                            'field_name' => ' IP_NAME_JIK_FE_MIN_TST'
                          },
                                                    {
                            'field_name' => ' IP_NAME_JIK_TM_LOOPA_HYU'
                          }
                        ],
            'register_name' => ' IP_NAME_JIK'
          },

]

Я хочу напечатать все имя_регистра из вышеуказанной структуры данных.

my @sorted_mm_register_list_1;
foreach my $register_name (sort keys %hash_reg_list{first_type}{registers})
    {
       $sorted_mm_register_list_1[$list_index] = $register_name;
       $list_index++;
       print "$hash_reg_list{first_type}{registers}{register_name}";
       printf("listindex: %s\n", $list_index);

    }

Как мне отследить следующую структуру данных, выгруженную из PERL? Любая помощь будет оценена?

1 Ответ

2 голосов
/ 19 марта 2020

$hash_reg_list{first_type}{registers} является ссылкой на массив. Вы хотите перебрать элементы ссылочного массива.

for my $register (@{ $hash_reg_list{first_type}{registers} }) {
   ...
}

или

for my $register ($hash_reg_list{first_type}{registers}->@*) {
   ...
}

(->@* требует Perl 5,24 или Perl 5,20 и use experimental qw( postderef ); )


$register - значение текущего элемента массива, которое является ссылкой на га sh. Вы хотите напечатать элемент этого ха sh с ключом register_name.

say $register->{register_name};

Все вместе мы получим

for my $register (@{ $hash_reg_list{first_type}{registers} }) {
   say $register->{register_name};
}

или

for my $register ($hash_reg_list{first_type}{registers}->@*) {
   say $register->{register_name};
}

Если бы мы хотели отсортировать регистры по имени регистра, мы бы использовали следующее:

for my $register (
   sort { $a->{register_name} cmp $b->{register_name} }
      @{ $hash_reg_list{first_type}{registers} }
) {
   say $register->{register_name};
}

или

for my $register (
   sort { $a->{register_name} cmp $b->{register_name} }
      $hash_reg_list{first_type}{registers}->@*
) {
   say $register->{register_name};
}

См. Perl Синтаксис разыменования для получения информации о разыменовании и ссылки на дополнительную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...