2009-04-07 9 views
6

Mam następujący fragment kodu w moim programie:Jak mogę rozróżnić między 0 i białymi znakami w Perlu?

$val = chr(someFunction()); 

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

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

Ale ilekroć 0 jest przekazywana do $ val, if część wykonuje zamiast elsif której spodziewać się stracony.

Jak mogę to naprawić?

Dziękuję.

Odpowiedz

23

Operator == służy do porównywania wartości numerycznych. Jeśli chcesz porównać łańcuchy, powinieneś użyć operatora eq.

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

Czy na pewno chcesz sprawdzić, czy $ val to dokładnie jedna spacja? Jeśli chcesz, aby pierwsza gałąź twojej instrukcji "if" była wykonywana, gdy $ val zawiera jeden lub więcej spacji, użyj zamiast tego wyrażenia regularnego. –

5

Istnieje kilka sposobów, aby to naprawić (TIMTOWDI). Można importować funkcję looks_like_a_number ze standardowego Scalar::Util opakowaniu:

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

można użyć operatora równości ciąg

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

Jeśli masz Perl 5.10, można użyć meczu Smart operatorowi

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

I wiele innych. Którą metodę używasz zależy w dużym stopniu od tego, co próbujesz osiągnąć.

+0

Wielkie dzięki za wyjaśnienie :) –

3

Jeśli włączono ostrzeżenia, użytkownik wiedziałby, na czym polegał problem.

Run to:

use strict; 
use warnings; 

my $val = chr(someFunction()); 

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

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

sub someFunction { 
    return 1; 
} 

I masz: C:> test.pl Argument "" nie jest numeryczne w eq numerycznej (==) w C: \ test.pl linia 6. argument "^ a" nie jest liczbą w równaniu (numerycznym) == C: \ test.pl 6. linia

Dodawanie zastosowania diagnostyczne daje to dodatkowe wyjaśnienie:

(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. 

Zatem, ponieważ nie chcemy wartości liczbowych, chcemy uzyskać ciąg eq: eq. Jeśli jeszcze tego nie wiesz, możesz przeczytać perldoc perlop, aby przeczytać o Equality Operators.

Jest to klasyczny przykład, w jaki sposób korzystanie z pragmy warnings i strict oszczędza czas.