Pregunta

Tengo un hash de esta manera:

my %h = ( a => { one => 1,
                 two => 2
             },
          b => { three => 3,
                 four => 4
             },
          c => { five => 5,
                 six => 6
             }
      );

print join(',', @{$h{a}{qw/one two/}});

El get error que es: No se puede utilizar un valor indefinido como una referencia ARRAY en q.pl línea 17 que es la línea con la impresión.

¿Qué es lo que esperaba 1,2

¿Fue útil?

Solución

Para obtener una rebanada de hash de un resumen anidada, que tiene de retirar la información en pasos. Se obtiene el primer nivel que necesita:

$h{'a'}

Ahora, usted tiene que eliminar la referencia que a medida que un hash. Sin embargo, ya que no es un escalar simple, hay que ponerlo en los apoyos. Para obtener todo el hachís, que había puesto un % delante de las llaves:

%{ $h{'a'} }

Ahora usted quiere una rebanada, por lo que sustituya el % con un @, ya que está recibiendo múltiples elementos, y también se puso las llaves al final lo más normal:

@{ $h{'a'} }{ @keys }

Puede parecer más fácil ver las llaves por separado:

@{         }{       }
   $h{'a'}    @keys

Para hacerlo mas simple, v5.20 introdujo el de sufijo eliminar la referencia . En lugar de envolver cosa entre llaves y trabajar desde adentro hacia afuera, se puede trabajar de izquierda a derecha:

$h{a}->@{qw/one two/};

Eso @ es lo mismo que viste en frente del primer aparato ortopédico. Todavía se sabe que es una rebanada de hash debido a un aparato ortopédico sigue el sigilo.

Otros consejos

try

print join(',',@{$h{'a'}}{qw/one two/});

uso de datos :: Dumper de gran ayuda en casos como éste

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top