• Publicidad

Variable no-inicializada

¿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.

Variable no-inicializada

Notapor Negrazo » 2013-10-05 12:53 @579

Hola a todos:

Tengo un script en donde leo algo de una base de datos, eso lo recojo en un arreglo, que consiste solo de un campo y cuando lo quiero comparar con un cierto valor, estoy recibiendo el mensaje:

Use of uninitialized value $doc[0] in string eq at /var/www/taxis/alta1_coches.pl line 53.

El código es el siguiente (bueno, solo la parte que interesa):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #########################################################################################################
  2. my $sth = $con->prepare("SELECT revista FROM coches where placas='$placas' ") ;
  3. $sth->execute() or die "No puedo leer en la Tabla Coches...!";
  4. @doc = $sth->fetchrow_array;
  5. if($doc[0] eq "")
  6.    {
  7.    $con->do("INSERT INTO coches(placas,chofer,sitio,permiso,serie,motor,permisionario,verificacion,revista,refrendo,status ) VALUES('$placas','$chofer','$sitio', '$permiso', '$serie','$motor','$permi', '$verif',  '$revista', '$refrendo', 'Activo' )") or die "No pude grabar en Coches";
  8.  
  9.    print "<B>Se grabo el registro del Coche con placas " . $placas . "</B><BR>";  }
  10. else
  11.    { print font ({-size=>'5',  -color=>'Red'},'Ya existe un coche con esas placas!');
  12. ##############################################################################################################
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Debo aclarar que el arreglo @doc lo estoy definiendo al principio del script:

my @doc = "";

El mensaje me lo manda en el archivo error.log de Apache2 y es solo un Warning, pero como estoy implementando todos mis sistemas en mod_perl, pues es muy exigente y esto lo manejo en muchos de mis scripts.

Cualquier idea es bienvenida.

Gracias.
Negrazo
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Publicidad

Re: Variable no-inicializada

Notapor explorer » 2013-10-05 14:21 @640

El valor de $doc[0] es indefinido porque eso es lo que devuelve la llamada a fetchrow_array().

Según el manual de DBI, fetchrow_array() devolverá undef si el campo correspondiente es un NULL (no que no haya encontrado ningún resultado, sino que sí ha encontrado un resultado, pero el primer campo de @doc es un NULL).

Yo probaría a cambiar la primera parte del SELECT por un do(), ya que se trata de una sentencia que solo vamos a emplear una vez.

(no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $nfilas = $con->do("SELECT revista FROM coches where placas='$placas'");
  2.  
  3. if (not defined $nfilas) {
  4.     die "No puedo leer en la Tabla Coches: " . $dbh->err;
  5. }
  6. if ($nfilas == 1) {
  7.     print font ({-size=>'5',  -color=>'Red'}, '¡Ya existe un coche con esas placas!');
  8. }
  9. elsif ($nfilas == -1) {
  10.     print font ({-size=>'5',  -color=>'Red'}, '¡Hubo un error en la consulta!');
  11. }
  12. else {
  13.     my $nfilas = $con->do(q{
  14.         INSERT INTO coches
  15.         (
  16.             placas, chofer, sitio, permiso, serie, motor, permisionario, verificacion, revista, refrendo, status
  17.         )
  18.         VALUES
  19.         (
  20.             ?,      ?,      ?,     ?,       ?,     ?,     ?,             ?,            ?,       ?,        ?
  21.         )
  22.         }, undef,
  23.         (
  24.             $placas,$chofer,$sitio,$permiso,$serie,$motor,$permi,        $verif,      $revista,$refrendo,'Activo'
  25.         )
  26.     ) or die "No pude grabar en Coches";
  27.  
  28.     $nfilas == 1 or die "Error al hacer la consulta (INPUT): " . $dbh->err;
  29.  
  30.     print b("Se grabo el registro del Coche con placas $placas"), br();
  31. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Variable no-inicializada(Resuelto)

Notapor Negrazo » 2013-10-05 16:52 @745

Estimado explorer:

Gracias por tu ayuda, ya resolví el asunto y realmente tienes razón,

Me esta devolviendo un "null" en el campo $doc[0] y eso es correcto, yo así lo manejo para saber si ese ítem no existe en la base de datos, no encontraba otra forma de probarlo.

Pero con tu respuesta, encontré que simplemente agregando "defined" a la pregunta se arregla y así fue:

=============================================================================================================
if(defined $doc[0] eq "") <---------- aquí está el cambio
{
$con->do("INSERT INTO coches(placas,chofer,sitio,permiso,serie,motor,permisionario,verificacion,revista,refrendo,status ) VALUES('$placas','$chofer','$sitio', '$permiso', '$serie','$motor','$permi', '$verif', '$revista', '$refrendo', 'Activo' )") or die "No pude grabar en Coches";

print "<B>Se grabo el registro del Coche con placas " . $placas . "</B><BR>"; }
else
{ print font ({-size=>'5', -color=>'Red'},'Ya existe un coche con esas placas!');
print "<BR>";
}
=============================================================================================================

Ya lo probé varias veces y mod-perl ya no está arrojando un solo error o warning.

Te reitero mi agradecimiento.

Negrazo.
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Re: Variable no-inicializada

Notapor explorer » 2013-10-05 19:01 @834

Lo que has escrito es un error sintáctico. defined() es una función que devuelve verdadero si su argumento no es undef. Y ahí, lo que has puesto, es que su argumento sea el resultado de una comparación.

Lo correcto es lo siguiente:

if (defined($doc[0]) and $doc[0] eq "")
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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

cron