2012-06-26 11 views
10

Sto provando a confrontare due variabili in cui di solito sono le stringhe. Queste variabili sono generate da un database, $var1 da un db e $var2 da un altro. Quando li paragono in loop, utilizzo l'operatore ne. Tuttavia ci sono momenti in cui queste variabili sono null o undef. Il confronto viene fatto come segue:Confronta due variabili (potenzialmente) undef in perl

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

Il problema è che se $var1 o $var2 sono undef allora ottengo un errore. Tuttavia, devo essere in grado di confrontare i valori come undef b/c. Dovrò scriverli. Ho preso in considerazione la conversione delle variabili in una stringa "NULL" e poi indietro, ma ciò sembrava inefficiente.

Un modo per risolvere il problema? Grazie!

risposta

11

verificare se sono definiti, troppo:

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

Questo stampa che non sono uguali se entrambi sono indefinita. Se vuoi un altro comportamento, modifica l'espressione if.

+0

Perché non stampare l'espressione se solo '$ var1' non è definito? – Prateek

+0

Questa era più la base della mia risposta ed è il motivo per cui l'ho selezionata. La risposta finale assomigliava a questa: 'a meno che ((! $ $ Definito e $! Definito $ var2) && (definito $ var1 && definito $ var2 && $ var1 eq $ var2))' – Prateek

+3

Una versione più breve che utilizza xor: 'if ((definito $ var1 xor definito $ var2) o $ var1 ne $ var2) ' –

7

Non è un errore confrontare i valori non definiti, è solo un avvertimento. Mi piace usare // operatore Perl (richiede> = v5.10) in casi come questo per garantire gli operatori sono definiti:

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

tratterà una stringa definita come la stringa vuota durante il confronto, per esempio.

Poiché si desidera che gli operandi abbiano un valore specifico quando vengono stampati (NULL era una possibilità), si potrebbe anche considerare l'utilizzo dell'operatore //=.

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

imposterà il valore di $var1 o $var2 a 'NULL' se sono indefiniti, e quindi eseguire il confronto.

+0

Mi piace questo concetto, e lo userò da qualche altra parte, ma non era specificamente quello che stavo cercando. – Prateek

5

Sembra che tu stia praticando il Perl sicuro usando use warnings; ma ora potresti essere giunto al punto in cui lo hai spento selettivamente. Questi avvertimenti sono per la tua protezione, tuttavia se sai che stai per confrontare delle stringhe undef, basta disattivarli per un po '(il comando no è locale al blocco che lo contiene, quindi si riaccendono).

use strict; 
use warnings; 

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

Un avvertimento con questo consiglio è che un confronto tra stringhe di undef e stringa vuota restituirà true, che può essere o meno ciò che è richiesto. –