sort

Синтаксис

sort SUBNAME LIST
sort BLOCK LIST
sort LIST

Описание

Осуществляет сортировку списка (массива) LIST и возвращает в качестве значения отсортированный список. Если аргументы SUBNAME или BLOCK не указаны, производится сортировка в соответствии со стандартным алгоритмом сравнения строк из библиотеки С.
Если указан аргумент SUBNAME, он должен представлять собой имя подпрограммы сравнения двух объектов, которая возвращает число, меньшее, равное или большее нулю в зависимости от результата сравнения двух элементов массива в соответствии с выбранным автором критерием сортировки.
ПРИМЕЧАНИЕ
В этой подпрограмме настоятельно рекомендуется использовать операторы <=> и cmp.

SUBNAME может также представлять собой скалярную переменную. В этом случае именем подпрограммы является значение этой переменной. Можно вместо имени отдельной подпрограммы просто поместить вычислительный блок BLOCK, реализовав таким образом безымянную встроенную подпрограмму. Такой подход имеет смысл в том случае, если операция сортировки осуществляется вами в отдельной процедуре или используется только один раз за всю работу программы.
В целях повышения эффективности работы, поскольку сортируемые массивы могут быть достаточно большими, функция sort использует упрощенный механизм вызова подпрограммы сравнения объектов, что накладывает на эту подпрограмму следующие ограничения.
  • Подпрограмма не может быть рекурсивной.
  • Два сравниваемых между собой элемента массива передаются в подпрограмму не через массив @_, а как глобальные переменные текущего пакета с зарезервированными именами $a и $b.
  • Передача аргументов осуществляется по адресу, и значения переменных $a и $b не изменяются.
  • Не допускается определение этих переменных как лексических.
  • Вы не можете завершить работу подпрограммы с помощью конструкций управления циклом или оператора goto.
В тех случаях, когда включен режим поддержки локали, сортировка по умолчанию производится в соответствии с таблицей текущей локали.
Вот несколько примеров использования функции sort:
# лексическая сортировка 
@articles = sort @files;
# то же, но с введением собственной процедуры сравнения 
@articles = sort ($a cmp $b} @files;
# а теперь игнорируем регистр
@articles = sort { uc($a) cmp uc($b) } @files;
# а теперь сортируем в обратном порядке 
@articles = sort {$b cmp $a} @files;
# сортировка в порядке возрастания чисел 
@articles = sort {$a <=> $b} @files;
# числовая сортировка в обратном порядке 
@articles = sort {$b <=> $а} @files;
# сортировка с определением подпрограммы сравнения 
sub byage {
      $age{$a} <=> $age{$b};   # полагаем, что в массиве числа
}
@sortedclass = sort byage @class;
# сортировка хэш-массива %age по значениям, вместо
# ключей, с помощью вложенной функции
@eldest = sort { $age{$b} <=> $age{$a} } keys %age;
Постарайтесь тщательно отладить код вашей подпрограммы сортировки, если вы отказываетесь от стандартного алгоритма. Дело в том, что в большинстве версий Perl для повышения скорости работы функции используется системный вызов qsort. Внутри этой системной функции отсутствуют средства проверки допустимости аргументов, поскольку qsort оптимизирована по скорости. Это означает, что некорректная работа подпрограммы сравнения легко может привести к фатальной ошибке и иным непредсказуемым последствиям.



2011-04-26 00:53:16 lykich

Thanks




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: