Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 124 >> Следующая

которая задает способ сравнения двух элементов. Для чего она нужна?
Нетрудно понять, что сортировка - это размещение множества элементов в
определенном порядке путем их сравнения между собой. Поскольку сравнить
сразу все элементы нельзя, нужно сравнивать их по два и, используя
результаты этих попарных сравнений, расставить все их по местам.
Программа сравнения определяется как обычная подпрограмма. Она будет
вызываться многократно, и каждый раз ей будут передаваться два аргумента
сортируемого списка. Данная подпрограмма должна определить, как первое
значение соотносится со вторым (меньше, равно или больше), и возвратить
закодированное значение (которое мы опишем чуть ниже). Этот процесс
повторяется до тех пор, пока не будет рассортирован весь список.
Чтобы повысить скорость выполнения, эти два значения передаются в
подпрограмму не в массиве, а как значения глобальных переменных $а и $ь.
(Не волнуйтесь: исходные значения $а и $Ь надежно защищены.) Эта
подпрограмма должна возвратить любое отрицательное число, если $а меньше
$ь, нуль, если $а равно $Ь, и любое положительное число, если $а больше
$Ь. Теперь учтите, что "меньше чем" соответствует вашему пониманию этого
результата в данном конкретном случае; это может быть сравнение чисел,
сравнение по третьему символу строки, наконец, сравнение по значениям
какого-то хеша с использованием передаваемых значений как ключей - в
обшем, это очень гибкий механизм.
Вот пример подпрограммы сортировки в числовом порядке:
sub by_number {
if ($а < $b) {
return -I;
} elsif ($a ~= $b) (
return 0;
} elsif ($a > $b) {
return 1;
}
}
Обратите внимание на имя by_number. На первый взгляд, в имени этой
подпрограммы нет ничего особенного, но скоро вы поймете, почему нам
нравятся имена, которые начинаются с префикса Ьу_.
Давайте разберем эту подпрограмму. Если значение $а меньше (в данном
случае в числовом смысле), чем значение $ь, мы возвращаем значение -1.
15. Другие операции преобразования данныл-
201
Если значения численно равны, мы возвращаем нуль, а в противном случае
возвращаем 1. Таким образом, в соответствии с нашей спецификацией
программы сравнения для сортировки этот код должен работать.
Как использовать данную программу? Давайте попробуем рассортировать такой
список:
@somelist = (1,2,4,8,16,32,64,128,256);
Если использовать с этим списком обычную функцию sort без всяких
"украшений", числа будут рассортированы так, как будто это строки, причем
сортировка будет выполнена с учетом кодов ASCII, т.е.:
Qwronglist = sort Qsomelist; # Qwronglist теперь содержит
(1,128,16,2,256,32,4,64,8)
Конечно, это не совсем числовой порядок. Давайте используем в функции
sort нашу только что определенную программу сортировки. Имя этой
программы ставится сразу после ключевого слова sort:
Qnghtlist = sort_by_nuinber Qwronglist;
# @nghtlist теперь содержит (1, 2, 4, 8, 16, 32, 64, 128,256)
Задача решена. Обратите внимание: функцию sort можно прочитать вместе с
ее спутницей, программой сортировки, на человеческом языке, т.е.
"рассортировать по числовым значениям". Вот почему мы использовали в
имени подпрограммы префикс Ьу_ ("по").
Такое тройное значение (-1, 0, +1), отражающее результаты сравнения
числовых значений, встречается в программах сортировки достаточно часто,
поэтому в Perl есть специальная операция, которая позволяет сделать все
это за один раз. Эту операцию часто называют "челноком" (или "космическим
кораблем", как следует из дословного перевода английского spaceship),
потому что ее знак - <=>.
Используя "космический корабль", можно заменить предыдущую подпрограмму
сортировки следующим кодом:
sub by_number {
$а <=> $b;
}
Обратите внимание на знак операции между двумя переменными. Да, он
действительно состоит из трех символов. Эта операция возвращает те же
значения, что и цепочка if/elsif из предыдущего определения этой
программы. Теперь все записано очень кратко, но этот вызов можно
сократить и дальше, заменив имя подпрограммы сортировки самой
подпрограммой, записанной в той же строке:
Qnghtlist = sort { $а <*=> $b } Qwronglist;
202
Иаучаем Perl
Некоторые считают, что такая запись снижает удобочитаемость. Мы с ними не
согласны. Некоторые говорят, что благодаря этому в программе исчезает
необходимость выполнять переход к определению подпрограммы. Но языку Perl
все равно. Наше собственное правило гласит: если код не умещается в одной
строке или должен использоваться более чем однажды, он оформляется как
подпрограмма.
Для операции сравнения числовых значений "челнок" есть соответствующая
строковая операция - сшр*. Эта операция возвращает одно из трех значений
в зависимости от результата сравнения двух аргументов по строковым
значениям. Вот как можно по-другому записать порядок сортировки, который
установлен по умолчанию:
Sresult = sort f 5а cmp 5b } Ssomelist;
Вам, вероятно, никогда не придется писать именно такую подпрограмму
(имитирующую встроенную функцию стандартной сортировки) - если только вы
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 124 >> Следующая