2010-06-05 12 views

risposta

16

Quando si tratta di operatori bit a bit. 123^456 è 435, ma "123"^"456" è "\x05\x07\x05". Gli operatori bit a bit funzionano numericamente se uno degli operandi è un numero.

+2

Buon punto. È interessante notare che se un operando è un numero, l'altro operando viene trattato come un numero: 'perl -le 'stampa per" 123 "^ 456, 123 ^" 456 "'' –

+0

Grazie, corretto. – hobbs

11

Posso solo pensare a uno: quando si verifica la verità. Le stringhe equivalenti a 0, ma che non sono "0", come "0.0", "0 but true", "0e0", ecc. Passano tutte looks_like_number e valutano in 0 in contesto numerico, ma sono ancora considerati valori veri.

10

un numero equivalente e la stringa si comportano diversamente nelle chiavi di hash - o, più in generale, ogni volta che stringa i un numero abbastanza grande:

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

Nota che siamo ancora all'interno del campo in cui Perl in grado di memorizzare il numero precisamente:

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

Non riesco a riprodurlo su nessuno dei miei sistemi; 'perl -le '$ h {1234000000000000} = 0; i tasti di stampa% h'' sputano 1234000000000000. Puoi pubblicare i risultati di questo codice sul tuo sistema: 'perl -MDevel :: Peek -le '$ n = 1234000000000000; $ n. ""; Scarica $ n; print $] '' –

+0

@Chas. Sono in esecuzione ActivePerl v5.10.0. Ho lo stesso comportamento con Perl v5.8.8 anche su una macchina Solaris. Ecco l'output del tuo codice, eseguito nella casella di Windows, con punto e virgola per indicare interruzioni di riga: 'SV = PVNV (0x238e4c) a 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

Sembra che le macchine su cui ho eseguito il test siano macchine a 64 bit e quelle su cui è stato eseguito il test sono macchine a 32 bit (o almeno versioni a 32 bit di '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> 
Problemi correlati