• Publicidad

Acceso a hash desde módulo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Acceso a hash desde módulo

Notapor primitivo » 2015-05-08 22:13 @967

Hola, un saludo.

Tengo el siguiente problema: No puedo retornar los valores de un hash contenido en una subrutina llamada desde un módulo, un trozo del código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package query;
  2. sub new {} #
  3. sub struct_user
  4. {
  5.         # Almacena datos de los usuarios actualmente conectados.
  6.         #my $q = new;
  7.         #my $class = shift;
  8.         #my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
  9.         my $struct = {
  10.                 users => {
  11.                         $nick   => {
  12.                                 id              =>      $id,
  13.                                 nickname        =>      $nick,
  14.                                 ip              =>      $ip,
  15.                                 modos           =>      $modos,
  16.                                 realname        =>      $realname,
  17.                                 identd          =>      $identd,
  18.                                 timestamp       =>      $timestamp
  19.                         }      
  20.                 },
  21.                 oldusers => {
  22.                         $id     => {
  23.                                 nickname        =>      $nick
  24.                         }      
  25.                 },
  26.         };
  27.         bless $struct;
  28.         return $struct;
  29. }
  30.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Intento buscar el valor correspondiente, de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use query;
  2. # defino un id cualquiera
  3. my $id = "pepe";
  4. # inicio el objeto
  5. my $dbq = new query();
  6. # pongo el valor;
  7. $dbq->struct_user->{oldusers}->{$id}->{nickname} = "pepe";
  8. # consulto el valor previo
  9. my $dbr = $dbq->struct_user->{oldusers}->{$id}->{nickname};
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero no logro obtener el valor "pepe" que aparentemente se almacena en el hash.

¿Qué hago mal?
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Publicidad

Re: Acceso a hash desde módulo

Notapor explorer » 2015-05-09 05:15 @260

En las líneas 11 y 22 estás poniendo $nick y $id, lo cual, para Perl, son variables. ¿Qué valor tienen? Si no tienen ninguno, pues estás creando un hash con una clave vacía.

Yo creo que, en esas líneas, te sobran los '$'. Y lo mismo para las líneas 7 y 9 de $id del segundo código.

Usa Data::Dumper o parecido para sacar el valor de $dbq en pantalla, y así verás qué aspecto tiene.
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

Re: Acceso a hash desde módulo

Notapor primitivo » 2015-05-09 06:32 @313

Gracias por responder, explorer. $nick y $id son variables que, efectivamente, previamente tienen sus valores, que los almaceno así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $dbq->struct_user(
  2.   $read_data[9],
  3.   lc($read_data[2]),
  4.   $read_data[6],
  5.   $read_data[7],
  6.   lc($read_data[10]),
  7.   lc($read_data[5]),
  8.   $read_data[4],
  9. );
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

en el módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub struct_user
  2. {
  3.         #Almacena datos de los usuarios actualmente conectados.
  4.         my $q = new;
  5.         my $class = shift;
  6.         my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
  7.         #print " " . $id . " " . $nick . "\n";
  8.         my $struct = {
  9.                 users => {
  10.                         $nick   => {
  11.                                 id                      =>      $id,
  12.                                 nickname        =>      $nick,
  13.                                 ip                      =>      $ip,
  14.                                 modos           =>      $modos,
  15.                                 realname        =>      $realname,
  16.                                 identd          =>      $identd,
  17.                                 timestamp       =>      $timestamp
  18.                         }      
  19.                 },
  20.                 oldusers => {
  21.                         $id             => {
  22.                                 nickname        =>              $nick
  23.                         }      
  24.                 },
  25.         };
  26.         #print " " . $struct->{users}->{$nick}->{nickname} . "\n";
  27.         bless $struct;
  28.         return $struct;
  29. }
  30.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Acceso a hash desde módulo

Notapor explorer » 2015-05-09 07:34 @357

Ya lo veo... pero... no sé muy bien qué pretendes: el new() no hace nada, mientras que lo dejas todo en manos de struct_user().

Si lo que quieres es crear una estructura que almacene datos de varios usuarios, entonces necesitas primero crear el objeto donde se van a almacenar. Y luego irles agregando con struct_user(). Por ejemplo:
Sintáxis: (query.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package query;
  2.  
  3. sub new {
  4.     my $struct = {};                    # almacén de información para todos los usuarios
  5.     bless $struct;                      # la bendecimos
  6.     return $struct;                     # y devolvemos
  7. }
  8.  
  9. sub struct_user {                       # estructura para un único usuario
  10.     my $self = shift;                   # objeto con todo el almacén
  11.                                         # datos del usuario a guardar
  12.     my($id,$nick,$ip,$modos,$realname,$identd,$timestamp) = @_;
  13.  
  14.     $self->{users}-> {$nick} = {
  15.                             id          => $id,
  16.                             nickname    => $nick,
  17.                             ip          => $ip,
  18.                             modos       => $modos,
  19.                             realname    => $realname,
  20.                             identd      => $identd,
  21.                             timestamp   => $timestamp
  22.     };
  23.     $self->{oldusers}->{$id} = {
  24.                             nickname    => $nick,
  25.     };
  26. }
  27.  
  28. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use query;
  3.  
  4. # defino un id cualquiera
  5. my $id = "pepe1";
  6.  
  7. # inicio el objeto
  8. my $dbq = new query();
  9.  
  10. $dbq->struct_user($id,"Er Pepe","127.0.0.1","absoluto","Jose Antonio",1,"Ahora");
  11.  
  12. use Data::Dumper;
  13. print Dumper $dbq;
  14.  
  15. # cambio el valor
  16. $dbq->{oldusers}->{$id}->{nickname} = "pepe";
  17.  
  18. # consulto el valor previo
  19. print $dbq->{oldusers}->{$id}->{nickname}, "\n";
  20. print Dumper $dbq;
  21.  
  22. #Otro usuario
  23. $dbq->struct_user("juan","Er Juan","127.0.1.1","relativo","Juan Antonio",2,"Más tarde");
  24.  
  25. print Dumper $dbq;
  26.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ves que primero creamos el almacén, y luego con llamadas a struct_user vamos creando registros de usuarios.
El último print saca esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = bless( {
                 'users' => {
                              'Er Juan' => {
                                             'realname' => 'Juan Antonio',
                                             'ip' => '127.0.1.1',
                                             'modos' => 'relativo',
                                             'nickname' => 'Er Juan',
                                             'identd' => 2,
                                             'id' => 'juan',
                                             'timestamp' => 'Más tarde'
                                           },
                              'Er Pepe' => {
                                             'timestamp' => 'Ahora',
                                             'id' => 'pepe1',
                                             'identd' => 1,
                                             'nickname' => 'Er Pepe',
                                             'modos' => 'absoluto',
                                             'ip' => '127.0.0.1',
                                             'realname' => 'Jose Antonio'
                                           }
                            },
                 'oldusers' => {
                                 'juan' => {
                                             'nickname' => 'Er Juan'
                                           },
                                 'pepe1' => {
                                              'nickname' => 'pepe'
                                            }
                               }
               }, 'query' );
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

No sé si esta es la estructura de datos que quieres crear.
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

Re: Acceso a hash desde módulo

Notapor primitivo » 2015-05-09 11:07 @505

Es lo que quiero. Gracias, lo probaré.
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Acceso a hash desde módulo

Notapor primitivo » 2015-05-12 06:29 @312

Tengo el siguiente problema.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. H N mmamam 1 1431429505 tom 127.0.0.1 +x C1wLFw HAH :perl
  2. novedad
  3. $VAR1 = bless( {
  4.                  'dbglines' => {},
  5.                  'dbadmins' => {},
  6.                  'ddb' => {
  7.                             'AkickPath' => 'akicks.dbecam',
  8.                             'GlinePath' => 'glines.dbecam',
  9.                             'CregPath' => 'cregs.dbecam',
  10.                             'AccessChan' => 'access.dbecam',
  11.                             'MemoPath' => 'memos.dbecam',
  12.                             'ModerPath' => 'moders.dbecam',
  13.                             'AdminPath' => 'admins.dbecam',
  14.                             'NickPath' => 'nicks.dbecam',
  15.                             'PreoPath' => 'preopers.dbecam',
  16.                             'ChanPath' => 'chans.dbecam',
  17.                             'OperPath' => 'opers.dbecam'
  18.                           },
  19.                  'dbmemos' => {},
  20.                  'dbopers' => {},
  21.                  'dbpreopers' => {},
  22.                  'dbnicks' => {},
  23.                  'dbakicks' => {},
  24.                  'dbchans' => {},
  25.                  'ddblocalusers' => {
  26.                                       'oldusers' => {
  27.                                                       'HAH' => {
  28.                                                                  'flooding' => 0,
  29.                                                                  'nickname' => 'mmamam'
  30.                                                                }
  31.                                                     },
  32.                                       'users' => {
  33.                                                    'mmamam' => {
  34.                                                                  'umodes' => '+x',
  35.                                                                  'realname' => 'perl',
  36.                                                                  'timestamp' => '1431429505',
  37.                                                                  'identd' => 'tom',
  38.                                                                  'nickname' => 'mmamam',
  39.                                                                  'ip' => '127.0.0.1',
  40.                                                                  'id' => 'HAH'
  41.                                                                }
  42.                                                  }
  43.                                     },
  44.                  'dbaccess' => {},
  45.                  'dbmoders' => {},
  46.                  'dbcregs' => {}
  47.                }, 'query' );
  48.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


pero luego, si deseo volver a imprimir el hash...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. HAH N mmamamff 1431429572
  2. Verificando..
  3. $VAR1 = bless( {
  4.                  'dbglines' => {},
  5.                  'dbadmins' => {},
  6.                  'ddb' => {
  7.                             'AkickPath' => 'akicks.dbecam',
  8.                             'GlinePath' => 'glines.dbecam',
  9.                             'CregPath' => 'cregs.dbecam',
  10.                             'AccessChan' => 'access.dbecam',
  11.                             'MemoPath' => 'memos.dbecam',
  12.                             'ModerPath' => 'moders.dbecam',
  13.                             'AdminPath' => 'admins.dbecam',
  14.                             'NickPath' => 'nicks.dbecam',
  15.                             'PreoPath' => 'preopers.dbecam',
  16.                             'ChanPath' => 'chans.dbecam',
  17.                             'OperPath' => 'opers.dbecam'
  18.                           },
  19.                  'dbmemos' => {},
  20.                  'dbopers' => {},
  21.                  'dbpreopers' => {},
  22.                  'dbnicks' => {},
  23.                  'dbakicks' => {},
  24.                  'dbchans' => {},
  25.                  'ddblocalusers' => {},
  26.                  'dbaccess' => {},
  27.                  'dbmoders' => {},
  28.                  'dbcregs' => {}
  29.                }, 'query' );
  30.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

queda vacío, estoy usando este método para meter datos y consultarlos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $read_data[1] eq "N" ) {
  2.     my $dbq = new query();
  3.     if ( $read_data[3] == 1 ) {
  4.  
  5.         $reader =~ m/^(.*):(.*)$/;     # Eliminamos el principio del realname ':' y lo capturamos
  6.         $realname = $2;
  7.         chomp($realname);
  8.         $dbq->struct_user(
  9.             $read_data[9], lc( $read_data[2] ), $read_data[6], $read_data[7],
  10.             lc($realname), lc( $read_data[5] ), $read_data[4]
  11.         );
  12.         print "novedad\n";
  13.         print Dumper $dbq;
  14.  
  15.     }
  16.     else {
  17.  
  18.         # miro que esté aún almacenado, pero no es así...
  19.         print "Verificando..\n";
  20.         print Dumper $dbq;
  21.  
  22.     }
  23. }
  24.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Será por lo que estoy declarando las llaves vacías?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package query;
  2.  
  3. sub new {
  4.     my $self = {
  5.         ddb => {
  6.             ModerPath  => "moders.dbecam",
  7.             OperPath   => "opers.dbecam",
  8.             AdminPath  => "admins.dbecam",
  9.             PreoPath   => "preopers.dbecam",
  10.             ChanPath   => "chans.dbecam",
  11.             NickPath   => "nicks.dbecam",
  12.             CregPath   => "cregs.dbecam",
  13.             AccessChan => "access.dbecam",
  14.             GlinePath  => "glines.dbecam",
  15.             AkickPath  => "akicks.dbecam",
  16.             MemoPath   => "memos.dbecam"
  17.         },
  18.         ddblocalusers => {},
  19.         dbmoders      => {},
  20.         dbopers       => {},
  21.         dbadmins      => {},
  22.         dbpreopers    => {},
  23.         dbchans       => {},
  24.         dbnicks       => {},
  25.         dbcregs       => {},
  26.         dbaccess      => {},
  27.         dbglines      => {},
  28.         dbakicks      => {},
  29.         dbmemos       => {}
  30.  
  31.     };
  32.     bless $self;
  33.     return $self;
  34. }
  35.  
  36. sub struct_user {
  37.  
  38.     # Almacena datos de los usuarios actualmente conectados
  39.     my $self = shift;
  40.     my ( $id, $nick, $ip, $modos, $realname, $identd, $timestamp ) = @_;
  41.     $self->{ddblocalusers}->{users}->{$nick}->{id}        = $id;
  42.     $self->{ddblocalusers}->{users}->{$nick}->{nickname}  = $nick;
  43.     $self->{ddblocalusers}->{users}->{$nick}->{ip}        = $ip;
  44.     $self->{ddblocalusers}->{users}->{$nick}->{umodes}    = $modos;
  45.     $self->{ddblocalusers}->{users}->{$nick}->{realname}  = $realname;
  46.     $self->{ddblocalusers}->{users}->{$nick}->{identd}    = $identd;
  47.     $self->{ddblocalusers}->{users}->{$nick}->{timestamp} = $timestamp;
  48.     $self->{ddblocalusers}->{oldusers}->{$id}->{flooding} = 0;
  49.     $self->{ddblocalusers}->{oldusers}->{$id}->{nickname} = $nick;
  50. }
  51.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Acceso a hash desde módulo

Notapor explorer » 2015-05-13 02:55 @163

En el primer código, cuando se llega a la línea 2, estás creando un nuevo objeto $dbq, por lo que estará vacío. Luego viene el if(), y si falla, salta a 18, para imprimirlo, y claro, está vacío.

Debes crear el new() solo una vez, en el momento de iniciar la estructura de datos, y mantenerlo a lo largo de la ejecución de todo el programa. Y lo mismo si lo lees de un archivo.

Por ejemplo, en la misma línea 2, declaras $dbq como variable local a ese contexto (con my()). Entonces, en cuanto salgas de las llaves que lo rodean (líneas 1 y 23), $dbq se perderá.
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

Re: Acceso a hash desde módulo

Notapor primitivo » 2015-05-17 22:07 @963

Efectivamente, no me había dado cuenta y está creando el objeto cada vez que pasaba por la condición, por eso se vaciaba.

Te agradezco mucho, explorer, y perdona la novatada :oops:
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004


Volver a Básico

¿Quién está conectado?

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