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

时间:2010-06-05 13:37:01

标签: perl string numbers

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

my $s = "10" + 5;

会导致$s被分配15

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

4 个答案:

答案 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>