Почему операторы '<' и 'lt' возвращают разные результаты в Perl? - PullRequest
3 голосов
/ 10 июля 2009

Я только изучаю операторы сравнения Perl. Я попробовал следующий код: -

$foo=291;
$bar=30;

if ($foo < $bar) { 
        print "$foo is less than $bar (first)\n"; 
}

if ($foo lt $bar) { 
        print "$foo is less than $bar (second)\n"; 
}

Вывод 291 меньше 30 (секунд) . Означает ли это, что оператор lt всегда преобразует переменные в строку, а затем сравнивает? В чем причина того, что Perl заставляет lt вести себя иначе, чем оператор <?

Спасибо

Ответы [ 5 ]

12 голосов
/ 10 июля 2009

Ваше предположение верно.Алфавитные операторы, такие как lt, сравнивают переменные как строки, тогда как символические операторы, такие как <, сравнивают их как числа.Вы можете прочитать <a href="http://perldoc.perl.org/perlop.html#Relational-Operators" rel="noreferrer">perlop справочную страницу для более подробной информации.

Обоснование заключается в том, что скаляры в Perl не являются типизированными, поэтому без вашего ведома Perl не будет знать, как сравнивать две переменные,Если бы он все-таки угадал, то иногда получал бы ошибку, что приводило бы к необходимости делать такие вещи, как ' ' + $a < ' ' + $b, для принудительного сравнения строк, что, вероятно, хуже, чем lt.

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

6 голосов
/ 10 июля 2009

Поскольку Perl свободно набирается, и значения могут в любой момент молча преобразовывать строки и целые числа, Perl нужны два различных типа операторов сравнения, чтобы различать целочисленное сравнение (<) и сравнение строк (lt). Если бы у вас был только один оператор, как бы вы заметили разницу?

2 голосов
/ 10 июля 2009

lt сравнивает значения лексически (то есть в ASCII / UNICODE или порядке локали), а < сравнивает значения численно. Perl имеет оба оператора по одной и той же причине "10" + 5 это 15, а не ошибка типа: он слабо типизирован. Вы должны всегда говорить компьютеру что-то однозначное. Языки со строгой типизацией, как правило, используют приведение для устранения неоднозначности, тогда как в слабо типизированных языках, как правило, используется множество операторов. Python (строго типизированный язык), эквивалентный "10" + 5, равен float("10") + 5.

2 голосов
/ 10 июля 2009

Обоснование? Это строковый оператор. Из "perldoc perlop":

Binary "lt" returns true if the left argument is stringwise less than the right argument.

Если это не то, что вы хотите, не используйте его.

0 голосов
/ 10 июля 2009

Означает ли это, что оператор 'lt' всегда преобразует переменные в а затем сравнить строку?

Да, см. perlop

В чем смысл создания Perl оператор 'lt' ведет себя не так '<' оператор? </p>

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

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