2012-11-08 4 views
3

i écrit un code:Strings correspondant

my $str = 'http://www.ykt.ru/cgi-bin/go?http://ya.ru'; 
my $str2 = 'http://ya.ru'; 
if ($str == $str2) 
{ 
    print "str = str2"; 
} 
else 
{ 
    print "str != str2"; 
} 

et il me montre que str = str2. Mais c'est faux. Seulement si $ str = 'http://ya.ru'; Ce sera vrai. Qu'est-ce qui ne va pas?

+2

Toujours 'utiliser des avertissements» – Tim

Répondre

10

Vous devez comparer des chaînes avec l'opérateur eq, comme ceci:

if ($str eq $str2) { ... } 

Il est en fait tout à fait une règle mnémotechnique pratique: lettres pour les chaînes, les non-lettres - pour les numéros (comme chaque opérateur de comparaison symbolique a un « verbeux 'alternative):

numbers | strings 
----------------- 
    == | eq 
    != | ne 
    <  | lt 
    >  | gt 
    <= | le 
    >= | ge 
<=> | cmp  

Sinon, une comparaison numérique sera utilisé: les deux opérandes seront jetés aux numéros, et les résultats de cette distribution seront comparés. Comme les deux chaînes commencent à partir d'un symbole non numérique (même après le rognage), il devient effectivement (0 == 0).

Notez que vous avez fait cette réponse posée avant si vous aviez commencé votre script avec ...

use warnings; 

... pragma, comme je l'ai fait here:

Argument "http://ya.ru" isn't numeric in numeric eq (==) at t.pl line 5. 
Argument "http://www.ykt.ru/cgi-bin/go?http://ya.ru" isn't numeric in numeric eq (==) at t.pl line 5.