• Publicidad

Problema para comparar variables = 0

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

Problema para comparar variables = 0

Notapor animal collective » 2012-07-25 17:08 @756

Estimados,

Estoy presentando problemas en un script al comparar si una variable es igual a cero. El código me deja algunas variable con un valor null; las variables null entran en el if() siendo que éste tiene la siguiente sentencia: if ($variable == 0 ).

Adjunto código, desde ya agradezco el apoyo.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2. #Transacciones
  3.  
  4. use MIME::Lite;
  5. use strict;
  6. use POSIX 'strftime';
  7. my $fecha = strftime "%d-%m-%Y %H:%M:%S", localtime;
  8. my $var_0;
  9. my $var_1;
  10. my $var_2;
  11. my $var_3;
  12. my $var_4;
  13. my $var0;
  14. my $var1;
  15. my $var2;
  16. my $var3;
  17. my $var4;
  18.  
  19. $var0=`perl -ne 'print if /0/' /u01/home/apli/admmon/mon/data/motorAirMiddleware.txt`;
  20. $var1=`perl -ne 'print if /1/' /u01/home/apli/admmon/mon/data/motorAirMiddleware.txt`;
  21. $var2=`perl -ne 'print if /2/' /u01/home/apli/admmon/mon/data/motorAirMiddleware.txt`;
  22. $var3=`perl -ne 'print if /3/' /u01/home/apli/admmon/mon/data/motorAirMiddleware.txt`;
  23. $var4=`perl -ne 'print if /4/' /u01/home/apli/admmon/mon/data/motorAirMiddleware.txt`;
  24.  
  25. $var_0= 0 + $var0;
  26. $var_1= 0 + $var1;
  27. $var_2= 0 + $var2;
  28. $var_3= 0 + $var3;
  29. $var_4= 0 + $var4;
  30.  
  31.  
  32. my $correo_0 = MIME::Lite->new(
  33.         From    => 'jma@correo.com',
  34.         To      => 'gest@correo.cl',
  35.         Subject => "OK (M0004-01-01) (".$var_0.")"  ,
  36.         Data    => "Todo a resultado correctamente",
  37. );
  38.  
  39. my $correo_1 = MIME::Lite->new(
  40.         From    => 'jma@correo.com',
  41.         To      => 'gest@correo.cl',
  42.         Subject => "ERROR 1 (M0004-01-01E) (".$var_1.")",
  43.         Data    => "Error en la llamada del ws",
  44. );
  45.  
  46. my $correo_2 = MIME::Lite->new(
  47.         From    => 'jma@correo.com',
  48.         To      => 'gest@correo.cl',
  49.         Subject => "ERROR 2 (M0004-01-01E) (".$var_2.")",
  50.         Data    => "Error en respuesta (no se encuentra el string ok)",
  51. );
  52.  
  53. my $correo_3 = MIME::Lite->new(
  54.         From    => 'jma@correo.com',
  55.         To      => 'gest@correo.cl',
  56.         Subject => "ERROR 3 (M0004-01-01E) (".$var_3.")",
  57.         Data    => "Error al incluir el archivo de parametros",
  58. );
  59.  
  60. my $correo_4 = MIME::Lite->new(
  61.         From    => 'jma@correo.com',
  62.         To      => 'gest@correo.cl',
  63.         Subject => "ERROR 4 (M0004-01-01E) (".$var_4.")",
  64.         Data    => "Error al ejecutar el archivo de parametros",
  65. );
  66.  
  67. MIME::Lite->send('smtp','smtpa',Timeout=>60);
  68.  
  69. if($var_0 == 0)
  70. {
  71.    $correo_0->send();
  72.    open(LECTURA,">>/u01/home/apli/admmon/mon/data/DATA_TRX/motorAi.csv");
  73.    print LECTURA $fecha." ; ".$var_0." ; OK \n";
  74.    close(LECTURA);
  75. }
  76.  
  77. if($var_1 == 1)
  78. {
  79.   $correo_1->send();
  80.   open(LECTURA,">>/u01/home/apli/admmon/mon/data/DATA_TRX/motorAi.csv");
  81.   print LECTURA $fecha." ; ".$var_1." ; ERROR \n";
  82.   close(LECTURA);
  83. }
  84.  
  85. if($var_2 == 2)
  86. {
  87.   $correo_2->send();
  88.   open(LECTURA,">>/u01/home/apli/admmon/mon/data/DATA_TRX/motorAi.csv");
  89.   print LECTURA $fecha." ; ".$var_2." ; ERROR \n";
  90.   close(LECTURA);
  91. }
  92.  
  93. if($var_3 == 3)
  94. {
  95.   $correo_3->send();
  96.   open(LECTURA,">>/u01/home/apli/admmon/mon/data/DATA_TRX/motorAi.csv");
  97.   print LECTURA $fecha." ; ".$var_3." ; ERROR \n";
  98.   close(LECTURA);
  99. }
  100.  
  101. if($var_4 == 4)
  102. {
  103.   $correo_4->send();
  104.   open(LECTURA,">>/u01/home/apli/admmon/mon/data/DATA_TRX/motorAi.csv");
  105.   print LECTURA $fecha." ; ".$var_4." ; ERROR \n";
  106.   close(LECTURA);
  107. }
  108.  
Coloreado en 0.019 segundos, usando GeSHi 1.0.8.4
Última edición por animal collective el 2012-07-25 17:29 @770, editado 1 vez en total
animal collective
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 43
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Publicidad

Re: Problema para comparar variables = 0

Notapor explorer » 2012-07-25 17:16 @761

¿Sale algún mensaje de error en pantalla?
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12780
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema para comparar variables = 0

Notapor animal collective » 2012-07-25 17:27 @768

explorer escribiste:¿Sale algún mensaje de error en pantalla?


No sale mensaje de error, el código está correcto, el problema es que siempre entra en el if(var == 0).

Te entrego más datos:

Lo que realiza el script es buscar en un log 4 números:
0, 1, 2, 3, 4

En el log solo estará uno de estos números, pero en mi caso la variable entra siempre en dos if(): en el if(var == 0) y en if(var == X).

La idea es que solo entre en el if(var == 0) cuando efectivamente la variable encuentre un 0 en el log.
animal collective
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 43
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Problema para comparar variables = 0

Notapor explorer » 2012-07-25 19:53 @870

Esto es lo que ocurre: cuando en la línea 19 buscas por un /0/, y no lo encuentra (porque en ese momento es otro valor), el valor que obtiene $var0 es 'undef'. Al llegar a la línea 25, $var_0 hace la operación matemática 0+undef, con lo que el resultado es 0. Por eso, cuando en el log no aparece un 0, siempre va a entrar en el if() del == 0: porque $var_0 siempre valdrá cero, independientemente de lo que valgan las otras variables.

Dices que en el log solo aparecerá un número. Bueno, pues la solución es usar solo una variable para almacenar ese número.

Es más... podemos usar ese valor numérico para que nos indexe los mensajes que vamos a usar en la composición del correo y en el mensaje que guardaremos en el .csv... así que... no nos hacen falta los if() (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open my $LOG, '<', '/u01/home/apli/admmon/mon/data/motorAirMiddleware.txt';
  2. my $registro = <$LOG>;                    # suponemos que el registro solo tiene una línea
  3. close $LOG;
  4.  
  5. my($valor) = $registro =~ m/([01234])/;   # $valor almacena el número capturado
  6. die "ERROR: no encontré ningún valor.\n" if not defined $valor;
  7.  
  8. my @condicion_de_error = qw( OK ERROR ERROR ERROR ERROR );
  9. my @mensajes_asunto = (
  10.     'OK (M0004-01-01)',
  11.     'ERROR 1 (M0004-01-01E)',
  12.     'ERROR 2 (M0004-01-01E)',
  13.     'ERROR 3 (M0004-01-01E)',
  14.     'ERROR 4 (M0004-01-01E)',
  15. );
  16. my @mensajes_data = (
  17.     'Todo ha resultado correctamente',
  18.     'Error en la llamada del ws',
  19.     'Error en respuesta (no se encuentra la cadena ok)',
  20.     'Error al incluir el archivo de parámetros',
  21.     'Error al ejecutar el archivo de parámetros',
  22. );
  23.  
  24. ## Confeccionamos el correo
  25. my $correo = MIME::Lite->new(
  26.         From    => 'jma@correoxxx.com',
  27.         To      => 'gest@correoxxx.cl',
  28.         Subject => "$mensajes_asunto[$valor] ($valor)",
  29.         Data    =>  $mensajes_data[$valor],
  30. );
  31.  
  32. ## y lo enviamos
  33. $correo->send('smtp','smtp.correoxxx.com',Timeout => 60);
  34.  
  35. ## Registro de lo ocurrido
  36. open my $REGISTRO, '>>', '/u01/home/apli/admmon/mon/data/DATA_TRX/motorAi.csv';
  37. print   $REGISTRO join(';', $fecha, $valor, $condicion_de_error[$valor]), "\n";
  38. close   $REGISTRO;
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4

Queda un poco más corto. Y más fácil de mantener.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12780
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