When does the difference between a string and a number matter in Perl 5?

♀尐吖头ヾ 提交于 2019-11-27 23:54:38

问题


If a string in Perl 5 passes looks_like_number, it might as well be a number. For instance,

my $s = "10" + 5;

results in $s being assigned 15.

Are there any cases where a string does not behave like its numeric equivalent would?


回答1:


When dealing with bitwise operators. 123 ^ 456 is 435, but "123" ^ "456" is "\x05\x07\x05". The bitwise operators work numerically if either operand is a number.




回答2:


I can only think of one: when checking for truth. Strings that are equivalent to 0, but that are not "0", such as "0.0", "0 but true", "0e0", etc. all pass looks_like_number and evaluate to 0 in numeric context, but are still considered true values.




回答3:


An equivalent number and string behave differently in hash keys -- or, more generally, any time we stringify a largish number:

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

Note that we are still within the range where Perl can store the number precisely:

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



回答4:


  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> 


来源:https://stackoverflow.com/questions/2980550/when-does-the-difference-between-a-string-and-a-number-matter-in-perl-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!