Asumir una estructura resumen anidada %old_hash
..¿Cómo puedo convertir limpiamente un hash Perl anidado en uno no anidado?
my %old_hash;
$old_hash{"foo"}{"bar"}{"zonk"} = "hello";
.. lo que queremos "aplanar" (lo siento si eso es la terminología equivocada!) A un hash no anidada utilizando el sub &flatten(...)
para que ..
my %h = &flatten(\%old_hash);
die unless($h{"zonk"} eq "hello");
la siguiente definición de &flatten(...)
hace el truco:
sub flatten {
my $hashref = shift;
my %hash;
my %i = %{$hashref};
foreach my $ii (keys(%i)) {
my %j = %{$i{$ii}};
foreach my $jj (keys(%j)) {
my %k = %{$j{$jj}};
foreach my $kk (keys(%k)) {
my $value = $k{$kk};
$hash{$kk} = $value;
}
}
}
return %hash;
}
Mientras que el código g solo funciona, no es muy legible o limpio.
Mi pregunta es doble:
- ¿De qué manera el código dado que no se correspondan a las mejores prácticas modernas de Perl? Se duro! :-)
- ¿Cómo lo limpiarías?
Por favor, dé un ejemplo de lo que quiere decir con 'aplanar'. No entiendo qué intenta hacer tu código. –
Sinan: Gracias por su comentario. He agregado un ejemplo de uso al principio de la pregunta. Espero que aclaren las cosas! – knorv
Tu ejemplo ayuda a un ** pequeño **: ¿Qué sucede si el hash es '(a => {b => 1}, c => {b => 2})'? –