Tengo un hash de las matrices que se declara como sigue:

my %hash;
push @{ $hash{ $value1[$_] } }, [ $value1[$_], $value2[$_], $value3[$_], $value4[$_], $value5[$_] ] for 0 .. $#value1;

Quiero ser capaz de inspeccionar los valores para cada clave con:

open KEYS, '>keys.txt' or die "Can't write to 'keys.txt'\n";

for my $key ( sort keys %hash ) {
    print KEYS "Key: $key contains the values: ";
    for my $value ( @{$hash{$value1}} ) {
        print KEYS "$value ";
    }   
    print KEYS "\n";
}
close(KEYS);

Mientras yo pueda visualizar las claves y los valores asociados usando Data::Dumper, la salida del código anterior da las ubicaciones de la memoria, en lugar de los valores, para cada clave. E. g:

Key: 'Value1' contains the values: ARRAY(0x7fcd8645ba68) 

Aunque estoy empujando el mismo número de valores en cada matriz, cada clave contiene un número diferente de valores

Es que hay algo mal con la manera en que voy sobre esto?

InformationsquelleAutor fugu | 2013-06-27

2 Comentarios

  1. 6

    Primero, en su bucle interno, tiene

    for my $value ( @{$hash{$value1}} ) {
        print KEYS "$value ";
    }   

    Lo que en la tierra es $value1? Creo que quería usar $key. Siempre use strict; use warnings para obtener advirtió acerca de los valores no definidos y declarados variables.

    A continuación, vamos a echar un vistazo de lo que sucede cuando hacemos

    my %hash;
    push @{ $hash{ $value1[$_] } }, "(value$_)" for 0 .. $#value1;

    lugar, es decir, que basta con pulsar un string en el arrayref en el hash. Entonces, la salida parece algo así como

    Key: Value1 contains the values: (value0)
    Key: Value2 contains the values: (value1)
    Key: Value3 contains the values: (value2)

    Aha! Cualquier cosa que empujar a que arrayref se imprime como es. Si usted empuja un anónimo arrayref como [...], se obtiene la stringification de referencia: ARRAY(0x1234567).

    Usted probablemente desea que el contenido de ese arrayref. Fácil: basta con eliminar la referencia.

    ...;
    print KEYS "[@$value] ";

    o algo por el estilo. El "[...]" se utiliza aquí sólo para agrupar visualmente la salida.


    Notas de estilo:

    Por favor considere 3-arg open léxicas con filehandles:

    my $filename = "keys.txt";
    open my $keys, "<", $filename or die "Can't open $filename: $!";

    o uso automático de manejo de errores:

    use autodie;
    open my $keys, "<", "keys.txt";

    De cualquier manera, es importante que incluya el razón para el fracaso $! en el mensaje de error, o es casi inútil.

    Lugar de utilizar el bucle, el código puede ser más elegante con map y join, dependiendo de su gusto. Yo probablemente habría escrito el bucle como

    use feature 'say';
    for my $key ( sort keys %hash ) {
        say {$keys} "Key: $key contains the values: "
          . join " ", map { "[@$_]" } @{ $hash{$key} };
    }
    • +1 para ir conjunto de 9 metros
    • Gracias – eso es impresionante!
    • +1 explicación Concisa, buenos ejemplos y bono de consejos de estilo!
  2. 3

    Eso es porque usted está empujando un arrayref en lugar de una lista de valores.

    Comparar

    push @array, [ $foo ];

    a

    push @array, $foo;

    Tanto @arrays contienen un solo elemento, pero el primero tiene un arrayref que contiene $foo, mientras que el segundo tiene un poco $foo.

    Si usted pierde la corchetes después de la primera push argumento de que va a ser bueno para ir.

Dejar respuesta

Please enter your comment!
Please enter your name here