0, 0e0, 0.0, -0, +0, 000 означают для Perl то же самое, почему?

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

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

5 ответов

Решение

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

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

Я не понимаю, что еще они должны иметь в виду?

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

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

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

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

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

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

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

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

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;
Другие вопросы по тегам