2010-06-05 12 views

Odpowiedz

16

Podczas pracy z operatorami bitowymi. 123^456 to 435, ale "123"^"456" to "\x05\x07\x05". Operatory bitowe działają numerycznie, jeśli jeden z operandów jest liczbą.

+2

Dobra uwaga. Co ciekawe, jeśli jeden z operandów jest liczbą, drugi operand jest traktowany jak liczba: 'perl -le 'print dla" 123 "^ 456, 123 ^" 456 "'' –

+0

Dzięki, poprawione. – hobbs

11

Mogę myśleć tylko o jednym: podczas sprawdzania prawdy. Struny, które są równoważne 0, ale które nie są "0", takich jak "0.0", "0 but true", "0e0" itp wszystkich przejść looks_like_number i ocenić na 0 w kontekście numerycznym, ale wciąż uważane są za prawdziwe wartości.

10

równoważnej liczby i ciąg zachowują się inaczej w klawisze skrótu - lub, bardziej ogólnie, za każdym razem mamy stringify numer largish:

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

pamiętać, że jesteśmy nadal w przedziale gdzie Perl można zapisać numer właśnie:

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

Nie mogę tego odtworzyć na żadnym z moich systemów; 'perl -le '$ h {1234000000000000} = 0; wydrukuj klucze% h'' wypluwa 1234000000000000. Czy mógłbyś opublikować wyniki tego kodu w swoim systemie: 'perl -MDevel :: Peek -le '$ n = 1234000000000000; $ n. ""; Zrzuć $ n; print $] '' –

+0

@Chas. Używam ActivePerl v5.10.0. Podobne zachowanie występuje również w Perl w wersji 8.8.8 na komputerze z systemem Solaris. Oto dane wyjściowe z twojego kodu, uruchamiane w oknie Windows, z średnikami, aby wskazać podziały wierszy: 'SV = PVNV (0x238e4c) at 0x182adb4; REFCNT = 1; FLAGI = (NOK, POK, pNOK, pPOK); IV = 0; NV = 1,234e + 015; PV = 0x18351ec "1.234e + 015" \ 0; CUR = 10; LEN = 36; 5.010000'. – FMc

+0

Wygląda na to, że maszyny, na których je testowałem, są komputerami 64-bitowymi, a te, które testowałeś, są komputerami 32-bitowymi (lub co najmniej 32-bitowymi wersjami '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> 
Powiązane problemy