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


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


@sorted_fields = map { $_->[1] }

sort { $a->[0] <=> $b->[0] } пар { [ /(\d+)/, $_ ] } ©fields,

В последнем примере выполняется компактная сортировка данных, разделен­ных запятыми (они взяты из файла UNIX passwd). Сначала выполняется число­вая сортировка файла по четвертому полю (идентификатору группы), затем — числовая сортировка по третьему полю (идентификатору пользователя) и алфа­витная сортировка по первому полю (имени пользователя).

print map { $_->[0] }     # Целая строка

sort {

$а->[1] <=> $Ь->[1]  # Идентификатор группы

II $а->[2] <=> $Ь->[2]  # Идентификатор пользователя

II

$а->[3] <=> $Ь->[3]  # Имя пользователя }

тар { [ $_, (split / /)[3,2,0] ] } cat /etc/passwd',


4.16. Реализация циклических списков    143

Компактная конструкция map/sort/map больше напоминает программирование на Lisp и Scheme, нежели обычное наследие Perl — С и awk. Впервые она была предложена Рэндалом Шварцем (Randal Schwartz) и потому часто называется «преобразованием Шварца».

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

Описание функции sort вperlfunc(l); описание операторов стр и <=> вperlop(l); рецепт 4.14.

4.16. Реализация циклических списков

Проблема

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

Решение

Воспользуйтесь функциями unshift и pop (или push и shift) для обычного мас­сива.

unshift(@circular, pop(@circular)), # Последний становится первым push (^circular, shift(@circular)), # И наоборот

Комментарий

Циклические списки обычно применяются для многократного выполнения од­ной и той же последовательности действий — например, обработки подключений к серверу. Приведенный выше фрагмент не является полноценной компьютерной реализацией циклических списков с указателями и настоящей цикличностью. Вместо этого мы просто перемещаем последний элемент на первую позицию, и наоборот.

sub grab_and_rotate (\@ ) { пу Slistref = shift, my $element = $listref->[0], push(@listref, shift @$listref), return $element;




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