• Publicidad

Un problema de hash por referencia

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Un problema de hash por referencia

Notapor danimera » 2008-06-25 14:44 @655

Estoy usando el HTML::Template para pasar unos datos y desplegarlos en un select, pero cuando utilizo este código de esta función
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub obtener_categorias{
    my($cliente) = @_;
    my $categorias = "../".$cliente."/db/categorias.txt";
    my @loop_data = ();
    my %loop;
    @categorias = kread($categorias,1,0);
   
    foreach $registro(@categorias){
     
        $registro =~ s/\n//g;
        ($id,$nombre,$privacidad) = split(/\|\|/, $registro);
   
       
        if ($privacidad == 0){
            #$categorias{'CATEGORIA'} = $nombre;
            #$categorias{'IDCATEGORIA'} = $id;
           
           $loop{CATEGORIA} = $nombre;
          $loop{IDCATEGORIA} = $id;
                       
            # push(@loop_data, \%categorias);
            push(@loop_data, \%loop);
        }
    }
    print "<pre>";
    print Dumper( @loop_data );
    print "</pre>";
               
    return @loop_data;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


EL Data::Dumper me arroja esto:
Código: Seleccionar todo
$VAR1 = {
          'CATEGORIA' => 'Punto 9',
          'IDCATEGORIA' => '9'
        };
$VAR2 = $VAR1;
$VAR3 = $VAR1;
$VAR4 = $VAR1;
$VAR5 = $VAR1;
$VAR6 = $VAR1;
$VAR7 = $VAR1;
$VAR8 = $VAR1;
$VAR9 = $VAR1;
$VAR10 = $VAR1;
$VAR11 = $VAR1;


Solamente me muestra el último valor obtenido del fichero, el punto9 en este caso.

Y cuando lo utilizo de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub obtener_categorias{
    my($cliente) = @_;
    my $categorias = "../".$cliente."/db/categorias.txt";
    my @loop_data = ();
    my %loop;
    @categorias = kread($categorias,1,0);
   
    foreach $registro(@categorias){
     
        $registro =~ s/\n//g;
        ($id,$nombre,$privacidad) = split(/\|\|/, $registro);
   
       
        if ($privacidad == 0){
            #$categorias{'CATEGORIA'} = $nombre;
            #$categorias{'IDCATEGORIA'} = $id;
           
           $loop{CATEGORIA} = $nombre;
          $loop{IDCATEGORIA} = $id;
                       
            # push(@loop_data, \%categorias);
            push(@loop_data, %loop); #AQUI SOLO QUITO EL / DE PASAR POR REFERENCIA
        }
    }
    print "<pre>";
    print Dumper( @loop_data );
    print "</pre>";
               
    return @loop_data;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El Data::Dumper me arroja esto. Ahí esta bien, me arroja todas las categorías, pero me da error en el HTML::Template:
Código: Seleccionar todo
$VAR1 = 'CATEGORIA';
$VAR2 = 'Punto 10';
$VAR3 = 'IDCATEGORIA';
$VAR4 = '10';
$VAR5 = 'CATEGORIA';
$VAR6 = 'Punto 11';
$VAR7 = 'IDCATEGORIA';
$VAR8 = '11';
$VAR9 = 'CATEGORIA';
$VAR10 = 'Punto 1';
$VAR11 = 'IDCATEGORIA';
$VAR12 = '1';
$VAR13 = 'CATEGORIA';
$VAR14 = 'Punto 2';
$VAR15 = 'IDCATEGORIA';
$VAR16 = '2';
$VAR17 = 'CATEGORIA';
$VAR18 = 'Punto 3';
$VAR19 = 'IDCATEGORIA';
$VAR20 = '3';
$VAR21 = 'CATEGORIA';
$VAR22 = 'Punto 4';
$VAR23 = 'IDCATEGORIA';
$VAR24 = '4';
$VAR25 = 'CATEGORIA';
$VAR26 = 'Punto 5';
$VAR27 = 'IDCATEGORIA';
$VAR28 = '5';
$VAR29 = 'CATEGORIA';
$VAR30 = 'Punto 6';
$VAR31 = 'IDCATEGORIA';
$VAR32 = '6';
$VAR33 = 'CATEGORIA';
$VAR34 = 'Punto 7';
$VAR35 = 'IDCATEGORIA';
$VAR36 = '7';
$VAR37 = 'CATEGORIA';
$VAR38 = 'Punto 8';
$VAR39 = 'IDCATEGORIA';
$VAR40 = '8';
$VAR41 = 'CATEGORIA';
$VAR42 = 'Punto 9';
$VAR43 = 'IDCATEGORIA';
$VAR44 = '9';

Software error:
HTML::Template->output() : fatal error in loop output : HTML::Template : Attempt to get nonexistent parameter 'punto 10' - this parameter name doesn't match any declarations in the template file : (die_on_bad_params set => 1) at C:/Perl/site/lib/HTML/Template.pm line 3068
 at E:\O'Telch\Sitios web\bitacora\riocauca\index.pl line 22


Bueno, ¿cómo puedo solucionar este problema?
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Notapor explorer » 2008-06-25 14:54 @662

Coloca la línea my %loop; dentro del bucle foreach del primer código que muestras.

Así, se crea un nuevo hash en cada vuelta.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor danimera » 2008-06-25 15:05 @670

GRACIAS GRACIAS
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados