• Publicidad

Error con Hash

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

Error con Hash

Notapor fjmn2001 » 2009-08-19 12:07 @546

Hola amigos de Perl en Español, les escribo en esta oportunidad por algunas dudas con respecto al hash...

Tengo en mi base de datos un campo para nacionalidad tipo char que toma solo dos valores V(venezolano) y E(extranjero).

Entonces para pasar los datos al template primero usaba array pero ahora quiero utilizar hash con la función map() pero me causa un error, que de verdad no entiendo por qué...

Fragmento de código de Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($row=$self->dbh->selectrow_array("SELECT * FROM persona WHERE ced_per='18581219'")) {
  map {$$varss{$_}= $$row{$_}} keys %$row;#en esta linea causa el error...
...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Este es el error...
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[error] [client ::1] Error executing run mode 'inf_per': Can't use string ("V") as a HASH ref while "strict refs" in use at /var/www/sga//sga/Formulario.pm line 45.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Espero su pronta respuesta, de antemano gracias...
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Publicidad

Re: Error con Hash

Notapor explorer » 2009-08-19 12:24 @558

Primera impresión:

El error indica que hay un '$' demás; o que algún '$' se debería convertir a '${...}'; o que quizás sea más cómoda la notación '->' que ver un par de '$$' juntos...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error con Hash

Notapor fjmn2001 » 2009-08-19 12:56 @580

Esta es la función completa...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub formulario {
  my $self   = shift;
  my @modo_a = @_;
  my $varss;
  my $row;
##DICE QUE ES NECESARIO DBH_CONFIG
  $self->dbh_config("DBI:Pg:host=127.0.0.1;dbname=sga", '***', '***');

##DEFINICION DE VARIABLES PARA EL TEMPLATE DEPENDIENDO DEL MODO ACTUAL....
  if ($modo_a[0] eq 'inf_per'){
     #if ($sex_per eq 'M'){$sex_per="Masculino"}else{$sex_per="Femenino"}
     $varss = {
        modo        => 'inf_per',
        base => $self->session->param('base')
     };
##CAMBIOS TEMPORALES A LA TABLA PERSONA PARA PRUEBA DEBE SER TABLA PROFESOR
if ($row=$self->dbh->selectrow_array('SELECT * FROM persona WHERE ced_per=\'18581219\'')) {
  map {$$varss{$_}= $$row{$_}} keys %$row;
  if ($$row{foto}) { $$varss{foto}="?rm=foto&ci=".$$varss{ci};}
}
 }
my $file = 'contenedor';
return $self->processtmpl($file,$varss);;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Re: Error con Hash

Notapor fjmn2001 » 2009-08-19 13:13 @592

Lo que se desea generar en un hash parecido a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$varss {
nombre del campo de la base de datos => valor del campo de la base de datos,
ced_per => '18581219',
...
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Tantos campos tenga la tabla para ser enviado al template
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$self->processtmpl($file,$varss);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Re: Error con Hash

Notapor explorer » 2009-08-19 14:40 @653

Primero, un par de recomendaciones. Recuerda que puedes etiquetar los trozos de código con marcas Perl. Fíjate en los botones que aparecen cuando estás editando un mensaje. Y segundo: recuerda que puedes reeditar tus propios mensajes, por lo que no necesitas enviar un segundo mensaje detrás de otro tuyo. Puedes reeditar y ampliar el primero.

En cuanto al código tuyo,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($row=$self->dbh->selectrow_array('SELECT * FROM persona WHERE ced_per=\'18581219\'')) {
    map {$$varss{$_} = $$row{$_}} keys %$row;
    if ($$row{foto}) {
        $$varss{foto} = "?rm=foto&ci=" . $$varss{ci};
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

según la documentación de DBI:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
       "selectrow_array"

         @row_ary = $dbh->selectrow_array($statement);
         @row_ary = $dbh->selectrow_array($statement, \%attr);
         @row_ary = $dbh->selectrow_array($statement, \%attr, @bind_values);

       This utility method combines "prepare", "execute" and "fetchrow_array" into a single call. If called in a list context, it returns the first row of data from the statement.  The $statement parameter can be a previously prepared statement handle, in which case the "prepare" is skipped.

       If any method fails, and "RaiseError" is not set, "selectrow_array" will return an empty list.

       If called in a scalar context for a statement handle that has more than one column, it is undefined whether the driver will return the value of the first column or the last. So don't do that.  Also, in a scalar context, an "undef" is returned if there are no more rows or if an error occurred. That "undef" can't be distinguished from an "undef" returned because the first field value was NULL.  For these reasons you should exercise some caution if you use "selectrow_array" in a scalar context, or just don't do that.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

que quiere decir
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
       "selectrow_array"

         @fila = $dbh->selectrow_array($sentencia);
         @fila = $dbh->selectrow_array($sentencia, \%atributos);
         @fila = $dbh->selectrow_array($sentencia, \%atributos, @valores_enlazados);

       Este método combina "prepare", "execute" y "fetchrow_array" en una sola llamada. Si se llama en una contexto de lista, devuelve la primera fila de datos de la sentencia. El parámetro $sentencia puede ser un manejador de sentencia preparado con anterioridad, en cuyo caso el "prepare" es obviado.

       Si cualquiera de los métodos falla, y "RaiseError" no está activado, "selectrow_array" devolverá una lista vacía.

       Si es llamado en contexto escalar para una sentencia que devuelva más de una columna, devolverá indefinido sin importar que el controlador devuelva el valor de la primera columna o la última. Así que no lo haga.  También, en contexto escalar, un "undef" es devuelto si no hay más filas o si ocurre un error. Este "undef" no puede ser distinguido de un "undef" devuelto a causa de que el primer valor fuera NULO. Por estas razones deberá ejercitar alguna precaución si usa "selectrow_array" en contexto escalar, o simplemente, no haga nada de esto.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y resulta que estás usando el método en contexto escalar (estás asignando el resultado a una variable escalar), así que estás haciendo lo contrario de lo que te piden en el manual.

Fíjate que, de forma normal, este método devolverá un arreglo con todas las columnas correspondientes a la primera fila de la consulta. Por eso lo recomendable es que uses un @rows en lugar de un $row.

Y claro, el código que sigue ya no es válido: estás intentando usar un escalar como una referencia a un diccionario (hash), y de eso ni se comenta en el manual de selectrow_array(). Fíjate que incluso en el nombre aparece el nombre "array". Y eso es lo que devuelve: un arreglo de las columnas de la fila.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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

cron