Когда разница между строкой и числом имеет значение в Perl 5? - PullRequest
10 голосов
/ 05 июня 2010

Если строка в Perl 5 проходит looks_like_number, она также может быть числом.Например,

my $s = "10" + 5;

приводит к присвоению $s 15.

Есть ли случаи, когда строка не ведет себя так, как ее числовой эквивалент?

Ответы [ 4 ]

16 голосов
/ 05 июня 2010

При работе с побитовыми операторами. 123 ^ 456 равно 435, но "123" ^ "456" равно "\x05\x07\x05". Битовые операторы работают численно, если любой из операндов является числом.

11 голосов
/ 05 июня 2010

Я могу думать только об одном: проверяя правду. Строки, эквивалентные 0, но не "0", такие как "0.0", "0 but true", "0e0" и т. Д., Все передают looks_like_number и оцениваются в 0 в числовом контексте, но все еще считаются истинными значениями.

10 голосов
/ 05 июня 2010

Эквивалентное число и строка ведут себя по-разному в хеш-ключах - или, в более общем случае, в любое время, когда мы строковым образом переводим большое число:

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
2 голосов
/ 16 апреля 2013
  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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...