Si está trabajando con los datos de los árboles ir más de dos niveles de profundidad, y se encuentra con ganas de caminar ese árbol, primero debe tener en cuenta que se va a hacer un montón de trabajo extra para ti si planeas volver a implementar todo lo que necesitas hacer manualmente en hashes de hash de hashes cuando hay muchas buenas alternativas disponibles (search CPAN for "Tree").
Sin saber cuáles son sus requisitos de datos en realidad, le señalaré ciegamente en tutorial for Tree::DAG_Node para comenzar.
Dicho esto, Axeman está en lo cierto, un hashwalk se realiza más fácilmente con recursion. He aquí un ejemplo para empezar si usted siente que es absolutamente necesario resolver su problema con los hashes de hashes de hashes:
#!/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";
}
}
es la salida:
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
Tenga en cuenta que no se puede predecir en qué orden los elementos hash se atravesarán a menos que usted vincule el hash a través de Tie :: IxHash o similar. De nuevo, si va a realizar tanto trabajo, le recomiendo un módulo de árbol.
Un contexto de lista no va a devolver una lista segmentada, sino una lista aplanada, por lo que no obtendrá dos escalares al mismo tiempo. Es mejor que deep_keys devuelva una referencia de matriz. – Axeman