0, 0e0, 0.0, -0, +0, 000 означают для Perl то же самое, почему?
Просто озадачивает меня.
Связанный, но другой вопрос: что означает "0, но факт" в Perl?
5 ответов
Perl не различает виды чисел. Глядя на всех тех, кто не имеет отношения к CS/ программисту, все они также значат для меня одно и то же: ноль. (Это одна из основ Perl: он пытается работать как люди, а не как компьютеры. "Если это выглядит как утка…")
Итак, если вы используете их как числа, они все одно и то же. Если вы используете их как строки, они отличаются. Это приводит к ситуациям, когда вам может потребоваться принудительная интерпретация ("0, но истина"; см. Также "nancy typing"). но по большому счету он "делает правильные вещи" автоматически.
Я не понимаю, что еще они должны иметь в виду?
Вы даете целые, научные, с плавающей запятой, целые числа со знаком и восьмеричные ноль. Почему они должны отличаться?
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;