Если вы работаете с древовидными данными, уходящим более чем на два уровня в глубину, и вы хотите пройтись по этому дереву, вам следует сначала подумать, что вы собираетесь сделать много дополнительной работы для себя, если вы планируете повторно реализовать все, что вам нужно. делать вручную хэши хэшей хэшей, когда доступно много хороших альтернатив (search CPAN для "Дерево").
Не зная, каковы на самом деле ваши требования к данным, я слепо укажу вам на руководство по Tree: :DAG_Node для начала.
Тем не менее, Axeman прав, хеш-прогулка проще всего выполняется с помощью рекурсии. Вот пример, который поможет вам начать, если вы чувствуете, что вам абсолютно необходимо решить свою проблему с помощью хэшей хэшей хэшей:
#!/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 или подобное — опять же, если вы собираетесь выполнить такой большой объем работы, я рекомендую модуль дерева.
02.10.2008