Почему в Perl для строк отдельные операторы сравнения?

Рейтинг: 2Ответов: 2Опубликовано: 02.02.2011

По работе пришлось столкнутся с программированием на Perl'е, и я заметил такую нелогичную вещь:

[do somesthing] unless $a < $b;

Не будет работать, если $a и $b - строки, для них нужно писать lt, gt и прочее. А в чем тогда смысл использования знаков $ % @, если для правильной работы с переменными надо всё равно знать их тип более точно? Или это очередное специальное исключение чтобы некоторым программистам работалось лучше, а остальные сетовали на нелогичность?

Ответы

▲ 4
  1. Не путайте теплое с мягким. Знаки $ % @ обозначают не тип, а структуру значения - скаляр, хеш, массив. С типизацией строка/число это никак не свзязано.
  2. Весь вопрос в следующем: что больше, 100 или 20? А кто Вам сказал, что это числа? Определение типа значений на самом деле менее удобно, чем разные операции. С одной стороны определять тип для каждой переменной намного более трудоемко, а с другой стороны очень часто появляются задачи сравнить две переменные с типом строка как числа или две переменные типа число как строки. Посмотрите любую программу на Си, пхп, других языках, там Вы очень часто увидите конструкцию toInt(a) < toInt(b). В Perl'е это делается намного проще. Надо всего лишь принять правила игры.
  3. На самом деле данный подход действительно удобен и очень логичен. Надо всего лишь понять его и принять. Тут писали про исторические причины появления разных операций и про то, что теперь уже менять Perl поздно. На самом деле никаких исторических причин нет. Разные операции введены осмысленно именно потому, что это фактически разные операции, и естественно никто не собирается этого менять. Если сравнивать с тем же Bash'ем, то в Perl'е значение операций lt,gt и <,> намеренно другое, чем в Bash'е (там lt,gt - числовые, а <,> - строковые).
  4. ВНИМАНИЕ! Операция gt не делает лексикографического сравнения. Это операция строкового сравнения. Операция лексикографического сравнения хорошо отсортирует такие строки: 'картинка 100', 'картинка 20' (двадцать будет меньше ста). Не обращали внимания на сортировку имен файлов в винде? Так вот, операция gt этого не умеет.
▲ 3

Сразу же оговорюсь, что ни разу в жизни ничего дельного не написал на Перле (хотя, в принципе, знаком с языком, особенно, в связи с регэкспами).

Я не знаю, есть там на самом деле типизация или нет, но совершенно очевидно, что эти операторы просто делают разные вещи:

  • > — численное сравнение
  • gt — лексикографическое сравнение

Вот пример:

  DB<16> print('11' < '2')

  DB<17> print('11' > '2') # число 11 больше числа 2 (хотя тип — строка)
1
  DB<19> print('11' gt '2')

  DB<18> print('11' lt '2') # строка '11' лексикографически меньше строки '2'
1