Página 1 de 1

Cómo hacer un array de hash

NotaPublicado: 2009-03-06 16:36 @733
por danimera
Resulta que hoy me levante mal... y se me olvidó mucho de lo poco que sabía de Perl. Ahora mi problema es hacer una función que me retorne un array de hash. El nombre de los campos los tengo en un array y son los que serán las Key y el valor lo tengo en otro array que serán los valores para los KEYS para lo que tengo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my  %dats;
$registros[0] = "5||22junio.jpg||tumb005.jpg||1||22||06||2008";
$registros[1] = "5||22mayo.jpg||tumb005.jpg||1||22||05||2008";
$registros[2] = "5||22marzo.jpg||tumb005.jpg||1||22||03||2008";
@campo = qw(ID nombre imagen categoria dia mes anno); #Estos campos pueden variar
#organizar un array de hash
        my $cantidad_campos = @campo;
        foreach $reg(@registros){


         @campos_reg = split(/\|\|/, $reg);

                for ($i=0;$i<=$cantidad_campos;$i++){

                $dats{$campo[$i]} = $campos_reg[$i];


            #%dats={$campo[$i] => "$campos_reg[$i]"};
            #$dats->{$campo[$i]} = $campos_reg[$i];
                }
        push (@registros_salida,\%dats);



        }

         return @registros_salida;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Me retorna algo así

Código: Seleccionar todo
$VAR1 = {
          '' => undef,
          'mes' => '08',
          'categoria' => '26',
          'dia' => '09',
          'id' => '305',
          'miniatura' => 'tumb_agosto9punto26.jpg',
          'anno
' => '2008
',
          'nombre' => 'agosto9punto26.jpg'
        };
$VAR2 = $VAR1;
$VAR3 = $VAR1;
$VAR4 = $VAR1;
$VAR5 = $VAR1;
$VAR6 = $VAR1;
$VAR7 = $VAR1;
$VAR8 = $VAR1;
$VAR9 = $VAR1;
$VAR10 = $VAR1;
$VAR11 = $VAR1;


No, ya me mamé con eso. No sé qué pudo pasarme pero no le dí. Gracias por ayudarme y perdón por molestar tanto.

NotaPublicado: 2009-03-06 17:08 @755
por Perl user
perldoc perldsc

Saludos,

NotaPublicado: 2009-03-06 18:49 @826
por explorer
Estás usando el mismo diccionario %dats en cada vuelta de $reg. Entonces \%dats siempre es el mismo valor, por lo que en cada bucle de $cantidad_datos estás sobrescribiendo el mismo diccionario.

Deberías reservar un nuevo %dats en cada una de esas vueltas.

NotaPublicado: 2009-03-07 08:52 @411
por kidd
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;
use Data::Dumper;

my @registros;

$registros[0] = "5||22junio.jpg||tumb005.jpg||1||22||06||2008";
$registros[1] = "5||22mayo.jpg||tumb005.jpg||1||22||05||2008";
$registros[2] = "5||22marzo.jpg||tumb005.jpg||1||22||03||2008";

my @campo = qw(ID nombre imagen categoria dia mes anno); #Estos campos pueden variar

my @registros_salida;

#organizar un array de hash
my $cantidad_campos = $#campo;

for my $reg(@registros){

    my @campos_reg = split(/\|\|/, $reg);

    my %dats;

    for (my $i=0;$i<=$cantidad_campos;$i++){
        $dats{$campo[$i]} = $campos_reg[$i];
    }


    push (@registros_salida,\%dats);

}

print Dumper( \@registros_salida );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Resultado:

Código: Seleccionar todo
$VAR1 = [
          {
            'categoria' => '1',
            'ID' => '5',
            'dia' => '22',
            'mes' => '06',
            'anno' => '2008',
            'imagen' => 'tumb005.jpg',
            'nombre' => '22junio.jpg'
          },
          {
            'categoria' => '1',
            'ID' => '5',
            'dia' => '22',
            'mes' => '05',
            'anno' => '2008',
            'imagen' => 'tumb005.jpg',
            'nombre' => '22mayo.jpg'
          },
          {
            'categoria' => '1',
            'ID' => '5',
            'dia' => '22',
            'mes' => '03',
            'anno' => '2008',
            'imagen' => 'tumb005.jpg',
            'nombre' => '22marzo.jpg'
          }
        ];

NotaPublicado: 2009-03-07 10:56 @497
por explorer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

## Constantes
my @registros = qw(
    5||22junio.jpg||tumb005.jpg||1||22||06||2008
    5||22mayo.jpg||tumb005.jpg||1||22||05||2008
    5||22marzo.jpg||tumb005.jpg||1||22||03||2008
);

#Estos campos pueden variar
my @campos = qw(
    ID nombre imagen categoria dia mes anno
);

## Variables
my @registros_salida;


## Organizar la estructura AoH
foreach (@registros) {

    my %dats;

    @dats{@campos} = split '\|\|';  # Rellenamos %dats
                                    # con los @campos leídos desde el registro.
                                    # Suponemos que el orden de @campos
                                    # coincide con el de extracción del registro leído.

    push @registros_salida, \%dats;
}

use Data::Dumper;
print Dumper \@registros_salida;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2009-03-09 11:30 @520
por danimera
¡Huy, gracias!... si ven las cosas por las cuales uno se bloquea... casi que no podía con eso. Gracias.