• Publicidad

Contador no incrementa variable

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

Contador no incrementa variable

Notapor emoremm440 » 2012-02-29 15:59 @707

Hola, Foro.

Lo que intento conseguir es que en base al siguiente código realice lo siguiente:

Abrir un archivo y leer la última cadena que contenga caracteres; posteriormente guardar esta cadena en un arreglo; una vez guardada realizar una búsqueda de un número que se encuentre en el rango de 0-5; una vez encontrado el número incrementar el valor de este en 1; posteriormente agregar una cadena de caracteres con la variable incrementada al mismo archivo para que posteriormente sea leído.

Detalles:

En teoría el código está tomando la última cadena de caracteres, aunque la última línea del archivo es un carácter de nueva línea, se omite con la instrucción #7 del archivo, una vez encontrado el patrón de búsqueda se guarda el valor en la variable "$match", posteriormente realiza las condicionales "if" si el valor encontrado se encuentra entre 0-5.

El problema surge cuando se entra al condicional "if" para incrementar el valor de la variable "contador" y se le pide imprimir en archivo, la impresión de la cadena de caracteres es exitosa pero el resultado de la variable siempre es 1.

Nota: el archivo base cuenta con 2 líneas; la primera es una cadena de caracteres la cual contiene el número 0, y la segunda cuenta con el carácter de nueva línea; cuando se ejecuta por primera vez el archivo la variable "contador" se incrementa (este caso es exitoso), para los siguientes casos cuando se ejecuta el archivo la variable "contador" queda en 1.

Adjunto mi código fuente y el archivo base en el cual se han grabado 3 ejecuciones del código.

Espero me puedan dar algún comentario para poder solventar este error.

Saludos.

Archivo base para leer y guardar cadenas de caracteres.
MONITOR_TRYING_PCSCF_ERROR.log
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
El nodo tiene registrados 0 intentos fallidos de Monitoreo
El nodo lleva 1 veces sin responder el SIP OPTIONS al DNS
El nodo lleva 1 veces sin responder el SIP OPTIONS al DNS
El nodo lleva 1 veces sin responder el SIP OPTIONS al DNS
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Código fuente en Perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -s
  2.  
  3. open  (LOGBUG, "MONITOR_TRYING_PCSCF_ERROR.log") || die "No se encuentra archivo";
  4.  
  5. @arreglo = <LOGBUG>;
  6.  
  7. $string = $arreglo[-1];
  8.  
  9. print " $string \n";
  10.  
  11.  if ($counter = $string =~ /([0-5])/){
  12.  
  13.         $match = $1;
  14.  
  15.         print "la palabra encontrada es '$match' en la cadena \n";
  16.  
  17.  close (LOGBUG);
  18. }
  19.  
  20.  
  21. if ($firts <= 5){
  22.  
  23. open  (LOGBUG, ">>MONITOR_TRYING_PCSCF_ERROR.log") || die "No se encuentra archivo";
  24.  
  25.  $contador = $first;
  26.  
  27.         $contador++;
  28.  
  29.  
  30. print LOGBUG "El nodo lleva $contador veces sin responder el SIP OPTIONS al DNS\n";
  31.  
  32. close (LOGBUG);
  33.  
  34. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
emoremm440
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-02-29 13:43 @613

Publicidad

Re: Contador no incrementa variable

Notapor explorer » 2012-02-29 17:15 @761

Bienvenido a los foros de Perl en español, emoremm440.

Si pones esta línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use warnings;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ejecutas
perl -c contador.pl
el propio perl te da la respuesta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Name "main::firts" used only once: possible typo at contador.pl line 22.
Name "main::first" used only once: possible typo at contador.pl line 26.
Name "main::counter" used only once: possible typo at contador.pl line 12.
contador.pl syntax OK
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La sintaxis está bien: es un programa Perl. Pero perl te avisa de que en la línea 22 y 26 hay dos variables que solo se usan una vez. Y lo mismo en la línea 12 para la variable $counter.

Así que... si una variable se usa una sola vez, significa que, aunque le demos un valor, no lo usamos en ningún sitio. O que estamos intentando usarla sin haberle dado un valor antes.

Perl te dice "possible typo", que quiere decir en inglés, que quizás te has equivocado a la hora de escribir el nombre de la variable.
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: Contador no incrementa variable

Notapor emoremm440 » 2012-02-29 18:04 @794

Hola.

Sustituí la variable "first" por "match" y eliminé la variable "counter" lo cual permite que el contador se incremente. El problema fue resuelto.

Como plus agregaré una instrucción para detener el ciclo de impresión cuando el contador llegue a 5.

Gracias por el comentario.

Saludos

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -s
  2.  
  3. open( LOGBUG, "MONITOR_TRYING_PCSCF_ERROR.log" ) || die "No se encuentra archivo";
  4.  
  5. @arreglo = <LOGBUG>;
  6.  
  7. $string = $arreglo[-1];
  8.  
  9. print " $string \n";
  10.  
  11. if ( $string =~ /([0-5])/ ) {
  12.  
  13.     $match = $1;
  14.  
  15.     close(LOGBUG);
  16. }
  17.  
  18. if ( $match <= 5 ) {
  19.  
  20.     open( LOGBUG, ">>MONITOR_TRYING_PCSCF_ERROR.log" ) || die "No se encuentra archivo";
  21.  
  22.     $contador = $match;
  23.  
  24.     $contador++;
  25.  
  26.     print LOGBUG "El nodo lleva $contador veces sin responder el Query\n";
  27.  
  28.     close(LOGBUG);
  29.  
  30. }
  31.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
emoremm440
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-02-29 13:43 @613

Re: Contador no incrementa variable

Notapor explorer » 2012-02-29 18:54 @829

Este es un ejemplo perfecto para usar Tie::File:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use autodie;
  3. use Modern::Perl;
  4. use Tie::File;
  5.  
  6.                                                # conexión
  7. tie my @log, 'Tie::File', 'MONITOR_TRYING_PCSCF_ERROR.log';
  8.  
  9. my $i = $#log;                                 # índice al último elemento de log
  10.  
  11. while ($log[$i] =~ /^\s+$/  and  $i != -1) {   # buscamos el último elemento no vacío
  12.     $i--;
  13. }
  14.  
  15. if ($log[$i] =~ /([0-5])/) {
  16.     my $contador = $1 +1;                      # aumentamos contador
  17.  
  18.                                                # agregamos última línea
  19.     push @log, "El nodo lleva $contador veces sin responder el Query\n";
  20. }
  21.  
  22. untie @log;                                    # desconexión
  23.  
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: 14480
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 12 invitados