Что такое функция sort в perl и как с ней работать

Описание функции

Sort — это встроенная функция perl.

По умолчанию, sort сравнивает элементы переданного списка как строки, сортирует их в алфавитном порядке и возвращает отсортированный список. Если задана директива use locale, при сортировке будут учитываться национальные установки.

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

Если необходимо изменить порядок сортировки, например, сортировать список из чисел, можно задать специальный блок сортировки.

Во время работы, sort присваивает значения из заданного списка двум специальным переменным $a и $b, и сравнивает их между собой. Эти переменные доступны в блоке сортировки.

Блок сортировки должен определить, какой из элементов должен быть «первым» в итоговом списке, и вернуть функции sort() значение:

  • -1, если «первым» будет значение переменной $a,
  • 1, если «первым» будет значение переменной $b,
  • 0, если порядок следования не имеет значения.

Можно вместо блока сортировки написать отдельную функцию, которая будет выполнять те же
действия, и передать sort ссылку на нее.

$a и $b являются глобальными переменными, поэтому объявлять их дополнительно не нужно.

 

Примеры использования функции sort()

Операторы <=> и cmp

Операторы <=> и cmp сравнивают между собой две скалярные величины и возвращают число, означающее результат сравнения.

Алгоритм работы:

  • если левый аргумент < правый аргумент функция вернет -1
  • если левый аргумент > правый аргумент функция вернет 1
  • если левый аргумент == правый аргумент функция вернет 0

Оператор <=> сравнивает между собой числа.

Оператор cmp сравнивает строки по алфавиту. Строка, начинающаяся с буквы, которая идет в алфавите раньше другой, будет считаться «меньшей» оператором сравнения.

Операторы сравнения возвращают данные именно в таком формате, в каком это требуется функции sort, и поэтому идеально подходят для использования при сортировке данных с ее помощью.

 

Сортировка с помощью операторов <=> и cmp

Простая сортировка числового ряда

 

Сортировка ключей хеша по значениям

 

Сортировка значений хеша

 

Сортировка сложной структуры данных

Допустим, есть хеш с номерами телефонов сотрудников. Нужно отсортировать его по именам сотрудников.

Вывод:

 

Сортировка сложной структуры данных по нескольким параметрам

Отсортируем список сотрудников по именам и номерам офиса.

Вывод:

 

Сортировка сложной структуры данных по нескольким параметрам 2

В данном примере у нас не хеш хешей, а массив хешей. Сортируем так же, по именам сотрудников и номеру офиса.

Вывод:

 

Полезные ссылки

Функция sort

perldoc.perl.org: sort
www.perlfect.com: Sorting Techniques

Алгоритмы сортировки

perldoc.perl.org: Sort — perl pragma to control sort() behaviour
www.perltutorial.org: Perl Sorting Algorithms

Что такое функция sort в perl и как с ней работать: 5 комментариев

  1. Сергей

    преклоняюсь перед представительницами прекрасного пола изучающими программирование или стезю администрирования. Прекрасная статья.

    1. Natalie Автор записи

      Тогда сортировка будет по правилам «алфавита». Сначала будут выведены цифры, потом буквы. Числа будут сортироваться в порядке от 1 до 9, но не по своему числовому значению, а по длине и порядку следования в них цифр, как если бы сортировались слова:
      сначала будут выводиться «май», потом «мария», потом «маска», потом «мир». Точно так же и цифры будут отсортированы: сначала «1», потом «11», потом «2».

      Пример:
      my @arr = (1, 2, 3, 5, 'c', 110, 34, 'a');

      print join(' ', sort {$a cmp $b} @arr );

      Результат:

      1 110 2 3 34 5 a c

  2. gal

    Вы не могли бы подсказать, как можно провести суммирование значений хеша? Например, имеется такой хеш: my %р = (‘груши’=> 20.5, ‘яблоки’=> 17.8, ‘сливы’=> 30.35, ‘арбуз’=> 15.8, ‘груши’=> 10.0, ‘сливы’=> 20.0). Нужно просуммировать значения с одинаковыми ключами, чтобы в итоге получился такой результат:
    груши 30,5
    яблоки 17,8
    сливы 50,35
    арбуз 15,8

    Я пока только начинаю разбираться с хешами, не все моменты по ним понятны, хотела бы попросить совет у практикующего perl-программиста :-)
    Спасибо!

Комментарии запрещены.