如果Perl 5中的字符串通过looks_like_number
,它也可能是一个数字。例如,
my $s = "10" + 5;
会导致$s
被分配15
。
是否有任何情况下字符串的行为与其等效数字不相符?
答案 0 :(得分:16)
处理按位运算符时。 123 ^ 456
为435,但"123" ^ "456"
为"\x05\x07\x05"
。如果任一操作数是数字,则按位运算符以数字方式工作。
答案 1 :(得分:11)
我只能想到一个:检查真相时。相当于0
但不是"0"
的字符串,例如"0.0"
,"0 but true"
,"0e0"
等,都会通过looks_like_number
并在数值上下文中评估为0
,但仍被视为真值。
答案 2 :(得分: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
答案 3 :(得分: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>