2015-02-03 3 views
0

Я новичок в Perl и имею небольшую идею о хешах. У меня есть хэш массива хэш массива хэш массива хэш (HoAoHoAoHoAoH) следующим образом.Разборки HoAoHoAoHoAoH в Perl

%my_hash = (
    key00 => 'value00', 
    key01 => [ 
     { key10 => 'value10', 
      key11 => 'value11', 
      key12 => [ 
       { key20 => 'value20', 
        key21 => 'value21', 
        key22 => [ 
         { key30 => 'value30', 
          key31 => [ 
           { color => 'blue', quantity => 10, boxes => [0,1,3] }, 
           { color => 'red', quantity => 2, boxes => [2,3] }, 
           { color => 'green', quantity => 5, boxes => [0]  }, 
          ], 
         }, 
        ], 
       }, 
      ] 
     } 
    ] 
); 

Что является самым простым способом доступа к «цвету», «количеству» и «коробкам»? Мне также необходимо выполнить арифметические операции с «количеством» s, например 10 + 2 + 5 (величина 0 + величина 1 + величина2).

+1

Когда вы начинаете использовать структуры данных, которые сильно вложены, вы должны рассмотреть возможность использования объектов. Взгляните на официальный учебник по объектно-ориентированному программированию Perl ['perlootut'] (http://perldoc.perl.org/perlootut.html). – ThisSuitIsBlackNot

ответ

0

Это очень похоже на проблему XY. Что вы пытаетесь решить здесь?

Вы можете получить доступ к элементу вашей структуры данных, как это:

print $my_hash{key01}[0]{key12}[0]{key22}[0]{key31}[0]{color},"\n"; 

Вы также можете перебирать нижние элементы с:

foreach my $something (@{ $my_hash{key01}[0]{key12}[0]{key22}[0]{key31} }) { 
    print $something->{'color'}; 
    print $something->{'quantity'} 
} 

Но это не выглядит как реальная проблема - что вы на самом деле пытается достичь? Я могу догадаться, что вы пытаетесь разобрать XML или аналогичный, и в этом случае почти наверняка лучший подход.

+0

Спасибо, это файл «config», предоставленный мне, что мне нужно разобрать, чтобы извлечь элементы во внутреннем массиве. – sputnik

+2

Это формат вашего файла конфигурации? Потому что это поход, и на самом деле вы должны попытаться отговорить людей от такой гадости. – Sobrique

+0

Ну, к сожалению, да. И это даже не в моих руках. :( – sputnik