• Publicidad

Error lectura de fichero

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

Error lectura de fichero

Notapor Xenon » 2019-03-18 15:41 @695

Buenas.

Llevo toda la tarde con un error tonto que no me deja vivir y por más que lo estudio no veo la forma de solucionarlo.

Resulta que leo un fichero que hace de base de datos; hago un foreach() y luego formateo cada línea para trabajar con cada campo. Recojo un dato en concreto y lo guardo en una variable. Todo va perfecto y lo hace perfecto, lo único que en la terminal me muestra errores apuntando a la última línea del fichero.

Como pensaba que era por el retorno de carro, he usado chomp con la línea.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. my @campos;
  3. my $fecha = "";
  4. open file, "<$fichero" or die print "No se abre el fichero";
  5. @todo = <file>;
  6.  
  7. foreach $linea (@todo) {
  8.     chop($linea);
  9.     @campos = split /\t/, $linea;
  10.     $fecha = $campos[6];
  11.     chomp($fecha);
  12.     if ( $fecha ne "No_Definido" and $fecha_fin ne "Permanente" and $fecha_fin ne "" ) {
  13.         print " La fecha es: $fecha \n";
  14.     }
  15. }                                              # Fin foreach
  16. @campos        = undef;
  17. @imprimir_todo = undef;
  18. close(file);
  19.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

El fallo que me muestra en el terminal es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Use of uninitialized value $fecha in scalar chomp at gestion.pl line 379, <file> line 9.
Use of uninitialized value $fecha in string ne at gestion.pl line 380, <file> line 9.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Es decir, falla en el chomp() de $fecha y el if(), apuntando a la línea 9 que es justo la última línea del fichero.

El caso es que uso este mismo código en otras partes del programa para trabajar con otros campos de la BD y no me da ningún problema o fallo.

A ver si me damos con el porqué.
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Publicidad

Re: Error lectura de fichero

Notapor explorer » 2019-03-18 16:43 @738

El error dice que en la línea 379 del código se está intentando hacer un chomp() de un valor no definido.

En otras palabras: $fecha no contiene ningún valor.

Mirando el código, $fecha se establece en la línea 378, o sea que $campos[6]... no está definido.

O sea... que el split() de la línea 377 no ha devuelto un valor para $campos[6]... o sea, $linea no contiene tantos campos como para llenar el número 6. O está vacía.

Solución: cambia el chop($linea) por chomp($linea) para asegurarnos de que solo quitamos los caracteres de final de línea.
Y luego... agregamos una línea después del chomp:

next if not $linea:

que nos evita procesar $lineas vacías.

Incluso se podría poner una línea

next if not $campos[6];

después del split() para estar completamente seguros de que tenemos "algo".

Este error es típico de los archivos que contienen una línea vacía al final.
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: Error lectura de fichero

Notapor Xenon » 2019-03-19 12:52 @578

Eres un máquina.

Ha sido poner la línea y... magia. Toda la tarde comiéndome la cabeza y solucionado en una línea. Muchísimas gracias por la ayuda que nos das en este foro. Me estás ayudando muchísimo. No conocía la orden next.

Si me pudieras explicar qué hace en concreto esa línea o esa orden te lo agradecería aún más.
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Re: Error lectura de fichero

Notapor explorer » 2019-03-19 14:47 @657

La documentación la tienes en tu propio ordenador (si tienes instalado el paquete de software perldoc).

Ejecuta perldoc perlsyn, y busca por la sección "Loop control".

También está en perldoc perlfunc (buscando por orden alfabético), pero es más cómodo buscarlo así: perldoc -f next

Si lo quieres leer en español, mira aquí: https://github.com/perldocES/perldoc-es ... erlsyn.pod y busca por la sección Control de bucles.
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 Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado