Página 1 de 1

Problema para comparar variables = 0

NotaPublicado: 2012-07-25 17:08 @756
por animal collective
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    => '[email protected]',
  34.         To      => '[email protected]',
  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    => '[email protected]',
  41.         To      => '[email protected]',
  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    => '[email protected]',
  48.         To      => '[email protected]',
  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    => '[email protected]',
  55.         To      => '[email protected]',
  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    => '[email protected]',
  62.         To      => '[email protected]',
  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.004 segundos, usando GeSHi 1.0.8.4

Re: Problema para comparar variables = 0

NotaPublicado: 2012-07-25 17:16 @761
por explorer
¿Sale algún mensaje de error en pantalla?

Re: Problema para comparar variables = 0

NotaPublicado: 2012-07-25 17:27 @768
por animal collective
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.

Re: Problema para comparar variables = 0

NotaPublicado: 2012-07-25 19:53 @870
por explorer
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    => '[email protected]',
  27.         To      => '[email protected]',
  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.002 segundos, usando GeSHi 1.0.8.4

Queda un poco más corto. Y más fácil de mantener.