Página 1 de 1

Variable no-inicializada

NotaPublicado: 2013-10-05 12:53 @579
por Negrazo
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

Re: Variable no-inicializada

NotaPublicado: 2013-10-05 14:21 @640
por explorer
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

Re: Variable no-inicializada(Resuelto)

NotaPublicado: 2013-10-05 16:52 @745
por Negrazo
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.

Re: Variable no-inicializada

NotaPublicado: 2013-10-05 19:01 @834
por explorer
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 "")