PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 137


Также возможна конструкция вида sort ИМЯ СПИСОК, где ИМЯ — имя функ­ции сравнения, возвращающей -1, 0 или +1. В интересах быстродействия нор­мальные правила вызова не соблюдаются, а сравниваемые значения, как по волшебству, появляются в глобальных пакетных переменных $а и $Ь. Из-за осо­бенностей вызова этой функции в Perl рекурсия в ней может не работать.

Предупреждение: значения $а и $Ь задаются в пакете, активном в момент вызо­ва sort, — а он может не совпадать с пакетом, в котором была откомпилирована передаваемая sort функция сравнения (ИМЯ)! Например:


4.15. Сортировка списка по вычисляемому полю   139

package Sort_Subs,

sub revnum { $b <=> $a }

package Other_Pack,

@all = sort Sort_Subs    revnum 4,   19,   8,   3,

Такая попытка тихо заканчивается неудачей — впрочем, при наличии ключа -хю о неудаче будет заявлено вслух. Дело в том, что вызов sort создает пакетные пере­менные $а и $Ь в своем собственном пакете, Other_Pack, а функция revnum будет использовать версии из своего пакета. Это еще один аргумент в пользу встроен­ных функций сортировки:

@all = sort  {  $b <=> $а } 4,   19    8,   3

За дополнительной информацией о пакетах обращайтесь к главе 10 «Подпро­граммы».

> Смотри также---------------------------------------------------------------------------------------------

Описание операторов стр и <=> Bperlop(l); описание функций kill, sort и sleep в perlfunc(l); рецепт 4.15.

4.15. Сортировка списка по вычисляемому полю

Проблема

Требуется отсортировать список, руководствуясь более сложным критерием, нежели простыми строковыми или числовыми сравнениям.

Такая проблема часто встречается при работе с объектами или сложными структурами данных («отсортировать по третьему элементу массива, на который указывает данная ссылка»). Кроме того, она относится к сортировке по несколь­ким ключам — например, когда список сортируется по дню рождения, а затем по имени (когда у нескольких людей совпадают дни рождения).




- Начало -  - Назад -  - Вперед -