如果Perl 5中的字符串通过looks_like_number
,它可能是一个数字。例如,Perl 5中的字符串和数字之间的区别是什么时候?
my $s = "10" + 5;
结果$s
被分配15
。
是否有任何情况下,一个字符串不像其等效的数字行为?
如果Perl 5中的字符串通过looks_like_number
,它可能是一个数字。例如,Perl 5中的字符串和数字之间的区别是什么时候?
my $s = "10" + 5;
结果$s
被分配15
。
是否有任何情况下,一个字符串不像其等效的数字行为?
在处理按位运算符时。 123^456
是435,但"123"^"456"
是"\x05\x07\x05"
。如果任一操作数是数字,则按位运算符可以数字化。
我只能想到一个:当检查真相。相当于0
但不是"0"
(例如"0.0"
,"0 but true"
,"0e0"
等)的字符串全部通过looks_like_number
并在数字上下文中评估为0
,但仍被视为真值。
的等效数字和字符串表现不同的哈希键 - 或者更一般,任何时候我们字符串化一个相当大的数字:
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
我不能在我的任何系统的复制本; 'perl -le'$ h {1234000000000000} = 0;打印键%h''吐出1234000000000000.你可以在你的系统上发布这段代码的结果:'perl -MDevel :: Peek -le'$ n = 1234000000000000; $ n。 “”;转储$ n;打印$]'' – 2010-06-05 15:05:50
@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
看来我测试过的机器是64位机器,你测试的机器是32位机器(或者至少32位版本的'perl')。 – 2010-06-05 16:27:18
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>
好点。有趣的是,如果其中一个操作数是一个数字,另一个操作数被视为一个数字:'perl -le'print for“123”^ 456,123 ^“456”' – 2010-06-05 14:57:20
谢谢,纠正。 – hobbs 2010-06-05 15:05:08