2010-06-05 65 views

回答

16

在处理按位运算符时。 123^456是435,但"123"^"456""\x05\x07\x05"。如果任一操作数是数字,则按位运算符可以数字化。

+2

好点。有趣的是,如果其中一个操作数是一个数字,另一个操作数被视为一个数字:'perl -le'print for“123”^ 456,123 ^“456”' – 2010-06-05 14:57:20

+0

谢谢,纠正。 – hobbs 2010-06-05 15:05:08

11

我只能想到一个:当检查真相。相当于0但不是"0"(例如"0.0","0 but true","0e0"等)的字符串全部通过looks_like_number并在数字上下文中评估为0,但仍被视为真值。

10

的等效数字和字符串表现不同的哈希键 - 或者更一般,任何时候我们字符串化一个相当大的数字:

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

注意,我们仍然在那里Perl可以存储号码的范围内精确地说:

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

我不能在我的任何系统的复制本; 'perl -le'$ h {1234000000000000} = 0;打印键%h''吐出1234000000000000.你可以在你的系统上发布这段代码的结果:'perl -MDevel :: Peek -le'$ n = 1234000000000000; $ n。 “”;转储$ n;打印$]'' – 2010-06-05 15:05:50

+0

@Chas。我正在运行ActivePerl v5.10.0。我也在Solaris机器上获得了与Perl v5.8.8相同的行为。这是您的代码输出,在Windows窗口中运行,用分号表示换行符:'0x182adb4处的SV = PVNV(0x238e4c); 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 2010-06-05 15:15:14

+0

看来我测试过的机器是64位机器,你测试的机器是32位机器(或者至少32位版本的'perl')。 – 2010-06-05 16:27:18

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> 
相关问题