Perl: размер массива в хэше, в другом хэше - PullRequest
0 голосов
/ 11 ноября 2010

Итак, у меня есть хеш% HoHoA. Каждый хэш-ключ верхнего уровня имеет хэш-ключ второго уровня в качестве значения. Каждый хэш второго уровня имеет массивы массивов в качестве значений.

В отладчике Perl это выглядит примерно так:

0 'Top_key_1'
1 HASH(0x...)
  'Second_Key_1' => ARRAY(0x...)
    0   'string 1'
    1   'string 2'
  'Second_Key_2' => ARRAY(0x...)
    0  ARRAY(0x...)
      0 'string 3'
      1 'string 4'
      2 'string 5'
    1  ARRAY(0x...)
      0 'string 6'
      1 'string 7'
2 'Top_key_2'

Я пытаюсь получить размер двух массивов каждого набора. В выше Например, Second_Key_2 имеет два массива, 0-й - размер 3.

my $count1 = $#{$HoHoA{$top_key}{$second_key}[0]}+1;
my $count2 = $#{$HoHoA{$top_key}{$second_key}[1]}+1;

и

my $count1 = @{$HoHoA{$group}{$suite}[0]};
my $count2 = @{$HoHoA{$group}{$suite}[1]};

Я получаю сообщение об ошибке, подобное: Невозможно использовать строку («строка 3») в качестве ссылки на ARRAY, когда используются «строгие ссылки»

Почему я получаю это сообщение об ошибке и что мне делать вместо этого?

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

Запустите его под отладчиком и рекурсивно выведите структуру данных или укажите на нее с помощью команды x.

Вы можете сделать это программно с помощью модуля Dumpvalue, но это гораздо менее удобно.

Я бы хотел, чтобы люди не думали, что я написал perllol как шутку. ☺

1 голос
/ 11 ноября 2010

$HoHoA{$group}{$suite}[0] не является arrayref;это строка, поэтому ошибка.Возможно, вам нужно отладить код, который строит вашу структуру данных.

0 голосов
/ 22 августа 2011

Похоже, вы зашли на один уровень слишком глубоко. Код ниже должен получить то, что вы хотите

my $count1 = @{$HoHoA{$group}{$suite}};

Вы также можете использовать Data :: Dumper, чтобы увидеть Структура вашего объекта, чтобы вы работали с форматом записи данных. использовать Data :: Dumper; распечатать самосвал ($ HoHoA);

...