Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Un problema de hash por referencia

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Jun 25, 2008 1:44 pm
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 212
Ubicación: Colombia
Un problema de hash por referencia Responder citando

Estoy usando el HTML::Template para pasar unos datos y desplegarlos en un select, pero cuando utilizo este código de esta función
Perl:
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;


EL Data::Dumper me arroja esto:
Código:
$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:
Perl:
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;


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:
$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?
Mensaje Mie Jun 25, 2008 1:54 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4034
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Mie Jun 25, 2008 2:05 pm
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 212
Ubicación: Colombia
Responder citando

GRACIAS GRACIAS
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group