Perl 5中字符串和数字之间的差异何时重要?

Cha*_*ens 10 string perl numbers

如果Perl 5中的字符串通过looks_like_number,它也可能是一个数字.例如,

my $s = "10" + 5;
Run Code Online (Sandbox Code Playgroud)

结果$s被分配15.

是否有任何情况下字符串的行为与其数字等价物不同?

hob*_*bbs 16

处理按位运算符时.123 ^ 456是435,但是"123" ^ "456""\x05\x07\x05".如果任一操作数是数字,则按位运算符以数字方式工作.

  • 好点子.有趣的是,如果任一操作数是一个数字,另一个操作数被视为一个数字:`perl -le'print for"123"^ 456,123 ^"456"'` (2认同)

Cha*_*ens 11

我只能想到一个:检查真相时.字符串等同于0,但并非"0""0.0","0 but true","0e0",等全通looks_like_number和评价0的数值范围内,但仍然被认为是真正的价值.


FMc*_*FMc 10

等效数字和字符串在散列键中的行为有所不同 - 或者更常见的是,在我们对大字符串进行字符串化时:

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

请注意,我们仍然在Perl可以精确存储数字的范围内:

> perl -e 'printf qq{%.f\n}, 1234000000000000 + $_ for +1, 0, -1'
1234000000000001
1234000000000000
1233999999999999
Run Code Online (Sandbox Code Playgroud)

  • 那讲得通.Perl将IV整形为字符串,并将NV格式化为"printf"%g"`格式.在32位机器上,1234000000000000生活在暮光区域,对于int来说它太大了,但仍然足够小,可以作为双精度整数表示,所以你不要注意*它不是一个int,直到你要求它是一个字符串. (3认同)