2010-06-05 6 views

Répondre

16

Lorsque vous traitez des opérateurs au niveau du bit. 123^456 est 435, mais "123"^"456" est "\x05\x07\x05". Les opérateurs bit à bit fonctionnent numériquement si l'un ou l'autre opérande est un nombre.

+2

Bon point. Fait intéressant, si l'un ou l'autre opérande est un nombre, l'autre opérande est traité comme un nombre: 'perl -le 'imprime pour" 123 "^ 456, 123 ^" 456 "'' –

+0

Merci, corrigé. – hobbs

11

Je ne peux penser qu'à un: quand je vérifie la vérité. Les chaînes qui sont équivalentes à 0, mais qui ne sont pas "0", comme "0.0", "0 but true", "0e0", etc. passent tous looks_like_number et évaluer à 0 dans le contexte numérique, mais sont toujours considérés comme vraies valeurs.

10

Un nombre équivalent et chaîne se comportent différemment dans les clés de hachage - ou, plus généralement, à tout moment, nous stringify un nombre assez grand:

my (%g, %h); 
$g{ 1234000000000000 } = undef; # '1.234e+015'  => undef 
$h{'1234000000000000'} = undef; # '1234000000000000' => undef 

Notez que nous sommes encore dans la plage où Perl peut stocker le nombre précisément:

> perl -e 'printf qq{%.f\n}, 1234000000000000 + $_ for +1, 0, -1' 
1234000000000001 
1234000000000000 
1233999999999999 
+0

Je ne peux pas reproduire ceci sur aucun de mes systèmes; 'perl -le '$ h {1234000000000000} = 0; les clés d'impression% h'' crachent 1234000000000000. Pourriez-vous publier les résultats de ce code sur votre système: 'perl -MDevel :: Peek -le '$ n = 1234000000000000; $ n. ""; Dump $ n; imprimer $] '' –

+0

@Chas. Je cours ActivePerl v5.10.0. J'ai le même comportement avec Perl v5.8.8 sur une machine Solaris. Voici la sortie de votre code, exécutez sur la boîte de Windows, avec des points-virgules pour indiquer les sauts de ligne: 'SV = PVNV (0x238e4c) à 0x182adb4; REFCNT = 1; FLAGS = (NOK, POK, pNOK, pPOK); IV = 0; NV = 1,234e + 015; PV = 0x18351ec "1.234e + 015" \ 0; CUR = 10; LEN = 36; 5,010000'. – FMc

+0

Il semble que les machines sur lesquelles je l'ai testé sont des machines 64 bits et celles sur lesquelles vous l'avez testé sont des machines 32 bits (ou au moins des versions 32 bits de 'perl'). –

2
DB<1> sub is_num { my $x = shift; "$x " ~~ $x } 

    DB<2> print is_num(123) 
1 
    DB<3> print is_num('123') 

    DB<4> 
Questions connexes