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


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


Поскольку входные данные каждой строки представляют собой выходные данные предыдущей строки (массив @temp, созданный в строке 1, передается sort в строке 2, а результат сортировки передается тар в строке 3), их можно объеди­нить в одну команду и отказаться от временного массива:

©sorted = map  {  $_->[1]  >

sort  {$a->[0] <=> $b->[0]  } map { [ length $_,  $_] } ©strings,

Теперь операции перечисляются в обратном порядке. Встречая конструкцию map/sort/map, читайте ее снизу вверх:


142   Глава 4 • Массивы

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

тар: нижний вызов тар строит временный список анонимных массивов. Спи­сок содержит пары из предварительно вычисленного поля (length $_) и ис­ходного элемента ($_). В этой строке показано, как происходит вычисление поля.

sort: список анонимных массивов сортируется посредством сравнения предва­рительно вычисленных полей. По этой строке трудно о чем-то судить — разве что о том, будет ли список отсортирован в порядке возрастания или убывания.

тар: вызов тар в начале команды превращает отсортированный список аноним­ных массивов в список исходных отсортированных элементов. Как правило, во всех конструкциях map/sort/map он выглядит одинаково.

Ниже показан более сложный пример, в котором сортировка выполняется по первому числу, найденному в каждой строке §f ields:

@temp = map {  [ /(\d+)/,   $_ ]  } ©fields, @sorted_temp = sort  {$a->[0] <=> $b->[0]  } @temp, <5>sorted_fields = map { $_->["!]  } @sorted_temp,

Регулярное выражение в первой строке извлекает из строки, обрабатывае­мой тар, первое число. Мы используем регулярное выражение /(\d+)/ в списко­вом контексте.

Из этого фрагмента можно убрать временный массив. Код принимает следую­щий вид:




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