2012-06-26 23 views
10

Estoy tratando de comparar dos variables en las que usualmente son cadenas. Estas variables se generan desde una base de datos, $var1 desde un db y $var2 desde otro. Cuando los comparo en un ciclo, uso el operador ne. Sin embargo, hay momentos en que estas variables son null o undef. La comparación se realiza de la siguiente manera:Compara dos (potencialmente) variables undef en perl

foreach my $var1 (@$varlist) 
{ 
    if ($var1 ne $var2) 
    { 
    print "vars are not equal"; 
    } 
} 

La cuestión es que si $var1$var2 o son undef entonces me da un error. Sin embargo, necesito poder comparar los valores como undef b/c. Tendré que escribirlos. Consideré convertir las variables a una cadena 'NULL' y luego de vuelta, pero eso parecía ineficiente.

¿Alguna manera de arreglar esto? Gracias!

Respuesta

11

Comprobar si están definidas, también:

foreach my $var1 (@$varlist) 
    if (! defined $var1 || ! defined $var2 || $var1 ne $var2) 
     print "vars are not equal"; 

Esta impresora que no son iguales si ambos están sin definir. Si desea otro comportamiento, simplemente cambie la expresión if.

+0

¿Por qué no imprimiría la expresión si simplemente '$ var1' no está definido? – Prateek

+0

Esto fue más la base de mi respuesta y por eso lo seleccioné. La respuesta final era la siguiente: 'a menos que ((! Defined $ var1 &&! Defined $ var2) && (definido $ var1 && defined $ var2 && $ var1 eq $ var2))' – Prateek

+3

Una versión más corta usando xor: 'if ((definido $ var1 xor defined $ var2) o $ var1 ne $ var2) ' –

7

No es un error comparar valores indefinidos, es solo una advertencia. Me gusta usar // operador de Perl (requiere> = v5.10) en casos como este para asegurar que los operadores se definen:

if (($var1 // '') ne ($var2 // '')) { ... } 

tratará a una cadena definida como la cadena vacía durante la comparación, por ejemplo.

Dado que desea que los operandos tengan un valor específico cuando se imprimen (NULL era una posibilidad), también podría considerar usar el operador //=.

if (($var1 //= 'NULL') ne ($var2 //= 'NULL')) { 
    print "$var1 and $var2 are not equal"; 
} 

fijará el valor de $var1 o $var2-'NULL' si no están definidos, y luego realizar la comparación.

+0

Me gusta este concepto, y lo usaré en otro lugar, pero no fue específicamente lo que estaba buscando. – Prateek

5

Parece que está practicando Perl seguro usando use warnings;, pero ahora es posible que haya llegado al punto en que los apaga selectivamente. Estas advertencias son para su propia protección, sin embargo, si sabe que va a comparar cadenas posiblemente indefinibles, simplemente desactívelas un poco (el comando no es local para el bloque adjunto, por lo que se vuelven a encender).

use strict; 
use warnings; 

foreach my $var1 (@$varlist) 
{ 
    no warnings 'uninitialized'; 
    if ($var1 ne $var2) 
    { 
    print "vars are not equal"; 
    } 
} 
+2

Una advertencia con este consejo es que una comparación de cadena de undef y una cadena vacía devolverá verdadero, lo que puede o no ser lo que se requiere. –

Cuestiones relacionadas