Об операторе "x" в Perl - PullRequest
       1

Об операторе "x" в Perl

0 голосов
/ 23 октября 2018

Меня смущает следующий вывод кода:

print "1234567890" x (10+9)/10;

Вывод

1.23456789012346e+188.

Я знаю, что код должен быть таким, чтобы получить ожидаемый результат:

"1234567890" x ((10+9)/10)

Но почему прежний код генерирует число с плавающей точкой, а не строку?Разве оператор "x" не является строковым оператором в Perl?

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity

x и / имеют одинаковый приоритет.Так что

print "1234567890" x (10+9)/10;

эквивалентно

print(  ("1234567890" x (10+9)) / 10  );

Обратите внимание, что x - это не только оператор повторения строк.Может генерировать списки: (1) x 3 is (1, 1, 1)

0 голосов
/ 23 октября 2018

Кажется, что 1234467890 concat'd 19 раз, а затем делится на 10, что создает число с плавающей точкой.

0 голосов
/ 23 октября 2018

Хорошо, давайте посмотрим, что Perl рассматривает это выражение как модуль B :: Deparse :

$ perl -MO=Deparse,-p -e 'print "1234567890" x (10+9)/10;'
print((3993258840062839 * 2**573));

Очевидно, что оно оценивает его как число.Может быть из-за разделения?Давайте попробуем убрать это.

$ perl -MO=Deparse,-p -e 'print "1234567890" x (10+9);'
print('1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');

, что выглядит правильно.Так что, в основном, он печатает это число, потому что вы рассматриваете эту действительно длинную строку как число благодаря разделению.

Обратите внимание, что x и / имеют одинаковый приоритет и остаются ассоциативными, так что a x b / c рассматривается как (a x b) / c.

0 голосов
/ 23 октября 2018

x является строковым оператором, но вы используете / для строки, которую он создает, которая нумерует

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...