2009-04-07 5 views
6

Ho il seguente pezzo di codice nel mio programma:Come posso differenziare tra 0 e lo spazio bianco in Perl?

$val = chr(someFunction()); 

if($val == " ") 
{ 
    #do something 

} 
elsif($val == 0) 
{ 
    #do something else 
} 

Ma ogni volta che 0 è passato a $ val, la parte se esegue invece del elsif cui mi aspetto di essere giustiziato.

Come posso risolvere questo?

Grazie.

risposta

23

L'operatore == viene utilizzato per confrontare i valori numerici. Se si desidera confrontare le stringhe, è necessario utilizzare l'operatore eq.

if ($val eq " ") ... 
+0

Inoltre, sei sicuro di voler verificare se $ val è esattamente un carattere di spazio? Se vuoi che il primo ramo della tua istruzione "if" venga eseguito ogni volta che $ val contiene uno o più spazi, usa una regex. –

5

Esistono diversi modi per risolvere questo problema (TIMTOWDI). Si potrebbe importare la funzione looks_like_a_number dal pacchetto standard Scalar::Util:

if (looks_like_a_number($val) and $val == 0) { 
    #do something 
} 

è possibile utilizzare l'operatore di uguaglianza stringa

if ($val eq 0) { 
    #do something 
} 

Se si dispone di Perl 5.10, è possibile utilizzare la partita operatore intelligente

if ($val ~~ 0) { 
    #do something 
} 

E molti altri. Il metodo che utilizzi dipende in larga misura da ciò che stai cercando di ottenere.

+0

Grazie mille per la spiegazione :) –

3

Se hai attivato gli avvisi, avresti saputo qual era il problema.

Esegui questo:

use strict; 
use warnings; 

my $val = chr(someFunction()); 

if($val == " ") 
{ 
    #do something 

} 
elsif($val == 0) 
{ 
    #do something else 
} 

sub someFunction { 
    return 1; 
} 

E si ottiene: C:> test.pl Argument "" non è numerico a eq numerica (==) in C: \ test.pl linea 6. argomento "^ a" non è numerico a eq numerica (==) in C: \ test.pl linea 6.

Aggiunta di utilizzare diagnosi ci dà questa spiegazione aggiuntiva:

(W numeric) The indicated string was fed as an argument to an operator 
    that expected a numeric value instead. If you're fortunate the message 
    will identify which operator was so unfortunate. 

Quindi, dal momento che non vogliamo eq numerici, vogliamo stringhe eq: eq. Se non lo sapevi già, puoi leggere in perldoc perlop per leggere su Equality Operators.

Questo è un classico esempio di come l'utilizzo dei comandi warnings e strict consente di risparmiare tempo.