0, 0e0, 0.0, -0, +0, 000 означают для Perl одно и то же, почему? - PullRequest
0 голосов
/ 24 марта 2011

Просто озадачивает меня.

Связанный, но другой вопрос: Что означает «0, но факт» в Perl?

Ответы [ 5 ]

8 голосов
/ 24 марта 2011

Perl не различает виды чисел. Глядя на всех тех, кто не имеет отношения к CS / программисту, все они также значат для меня одно и то же: ноль. (Это одна из основ Perl: он пытается работать как люди, а не как компьютеры. «Если это похоже на утку ....»)

Итак, если вы используете их как числа, они все одно и то же. Если вы используете их как строки, они отличаются. Это приводит к ситуациям, когда вам может потребоваться принудительная интерпретация («0, но истина»; см. Также «nancy typing» ). но по большому счету он "делает правильные вещи" автоматически.

3 голосов
/ 24 марта 2011

0==0 как известно всем, включая Ларри Уолла.

3 голосов
/ 24 марта 2011

Не понимаю, что еще они должны значить?

Вы даете целые, научные, с плавающей запятой, целые числа со знаком и восьмеричные ноль. Почему они должны отличаться?

2 голосов
/ 24 марта 2011

Perl интерпретирует каждое скалярное значение как строку и (потенциально) число.Все эти строковые представления нуля могут быть преобразованы в целочисленное значение 0 в соответствии с правилами преобразования perl:

"0", "0.0", "-0", "+0", "000" =>Простейший случай преобразования прямой строки в числовой.«0e0» => В числовом контексте преобразуются только первые действительные числовые символы, поэтому используется только начальный «0».Например, «1984abcdef2112» будет численно интерпретироваться как 1984.

«0, но истина» в perl означает, что строка, подобная «0e0», будет численно оценена в 0, но в логическом контексте будет «истинно»потому что преобразование в логическое значение следует другим правилам, чем строгое числовое преобразование.

1 голос
/ 24 марта 2011

Perl работает в контекстах.В строковом контексте они все разные.В числовом контексте все они равны нулю.

print "same string\n" if '0' eq '0.0';
print "same number\n" if 0 == 0.0;

'0, но истина' в логическом контексте - true:

print "boolean context\n" if '0 but true';
print "string context\n" if '0 but true' eq '0';
print "numeric context\n" if '0 but true' == 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...