Hay un error.
En la línea 13 estás llamando a R, con dos argumentos. El primero es una referencia (lo has comprobado en la línea 10). Y el segundo, realmente, son TODOS los elementos del array @ac. Es decir, Perl "despliega" el contenido del array, y le pasa a R() un argumento por cada elemento del array.
Y... ahora viene el problema. En la línea 4 pones que el siguiente argumento a la referencia, es un solo elemento (lo sacas con un shift) y lo metes en el nuevo array @ab.
O sea... que no lees el resto de argumentos, el resto de elementos del array de la llamada.
La solución es pasar el array como referencia:
Using perl Syntax Highlighting
my @ab = @_; # este es el array que almacena los argumentos que quedan después del shift anterior
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Using perl Syntax Highlighting
R($a->{$b}, \@ac);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí te pongo mi solución:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.20; # para usar las nuevas características de desreferencia. Ver perlref
use experimental 'signatures'; # usar la característica experimental de signatures en las sub
my %EW = (
'a' => {
'b' => {},
'c' => {},
'd' => {},
'e' => {},
'f' => {
'g' => {},
'h' => {},
'i' => {}
},
'j' => {},
},
);
my %ET;
my @ruta;
procesa_hash(\%EW, []);
sub procesa_hash($hash_ref, $ruta_ref) {
while (my($clave, $valor) = each $hash_ref->%*) {
next if ref $valor ne 'HASH';
my @nueva_ruta = ( $ruta_ref->@*, $clave); # creamos una nueva ruta a esa clave
$ET{ $clave } = join "/", @nueva_ruta; # la guardamos
procesa_hash($valor, \@nueva_ruta); # procesamos el nuevo hash
}
}
use Data::Dumper;
say Dumper \%ET;
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using text Syntax Highlighting
$VAR1 = {
'b' => 'a/b',
'a' => 'a',
'd' => 'a/d',
'h' => 'a/f/h',
'i' => 'a/f/i',
'c' => 'a/c',
'f' => 'a/f',
'j' => 'a/j',
'e' => 'a/e',
'g' => 'a/f/g'
};
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4