Если вы работаете с древовидными данными глубиной более двух уровней, и вам захочется пройтись по этому дереву, вам следует сначала подумать о том, что вы собираетесь проделать большую дополнительную работу для себя, если планируете переопределить все вам нужно делать вручную хэши хэшей, когда есть много хороших доступных альтернатив ( поиск CPAN для "Tree" ).
Не зная, каковы ваши требования к данным на самом деле, я буду слепо указывать вам на учебник для Tree :: DAG_Node , чтобы вы начали.
Тем не менее, Аксеман прав, мошенничество легче всего сделать с помощью рекурсии. Вот пример для начала, если вы чувствуете, что должны решить свою проблему с помощью хэшей хэшей:
#!/usr/bin/perl
use strict;
use warnings;
my %hash = (
"toplevel-1" =>
{
"sublevel1a" => "value-1a",
"sublevel1b" => "value-1b"
},
"toplevel-2" =>
{
"sublevel1c" =>
{
"value-1c.1" => "replacement-1c.1",
"value-1c.2" => "replacement-1c.2"
},
"sublevel1d" => "value-1d"
}
);
hashwalk( \%hash );
sub hashwalk
{
my ($element) = @_;
if( ref($element) =~ /HASH/ )
{
foreach my $key (keys %$element)
{
print $key," => \n";
hashwalk($$element{$key});
}
}
else
{
print $element,"\n";
}
}
Будет выведено:
toplevel-2 =>
sublevel1d =>
value-1d
sublevel1c =>
value-1c.2 =>
replacement-1c.2
value-1c.1 =>
replacement-1c.1
toplevel-1 =>
sublevel1a =>
value-1a
sublevel1b =>
value-1b
Обратите внимание, что вы НЕ МОЖЕТЕ предсказать, в каком порядке будут проходить хеш-элементы, если вы не свяжете хеш через Tie :: IxHash или аналогичный - опять же, если вы собираетесь выполнить такую большую работу, я рекомендую модуль дерева .