Все для вебмастера!!! |
|
PERL - Полезные советы. Иногда бывает необходимо преобразовать массив чего-либо в хэш-массив. Это можно сделать так:
Например:
Этот оператор преобразует массив ('a', 'b',
'c') в хэш-массив ('a', 1', 'b', 1, 'c', 1) .
Автор: Joseph N. Hall Предположим, мы имеем http log примерно следующего содержания
и нам хочется сделать хэш-массив, состоящий из
первых слова каждой строки, а значением элемента массива - количество повторений
этого слова
Этот же фрагмент кода можно переписать и в более
пространном виде
Вот еще подобный фрагмент кода
Но в этом случае содержимое всего файла считывается
в память (<> в контексте списка) перед тем, как продолжить вычисления.
Это, конечно, неудобно в случае файла большого размера.
Автор: Joseph N. Hall Инверсия хэш-массива один-к-одному.Предположим, мы имеем следующий хэш-массив, содержащий информацию о соответствии IP адресов и символьных имен
Таким образом, используя IP адрес в качестве индекса
мы можем получить его символьное имя. А как сделать наоборот?
В случае хэш-массива с отношением один-к-одному
мы получим хэш-массив с обратным соответствием, т.е. сможем определять IP
адрес имея его символьное имя.
Автор: Joseph N. Hall Проверка: если ли в файле обе искомые строки. Нам необходимо определить, если ли в файле обе строки текста 'george' and 'judy'?
Соль этого фрагмента в использовании операторов
||= (ИЛИ-присвоение) и & (побитовый И). Программа считывает файл по
строкам в переменную $_ оператором <>. Как только встретится строка
'george', переменной $s1 будет присвоено значение 1 (истина). Не забывайте,
что оператор $s1 ||= /george/ означает то же, что и $s1 = $s1 || /george/
-- как только $s1 примет значение ИСТИНА, программа больше не будет делать
проверку на строку /george/. $s2 ||= /judy/ работает подобным образом. Программа
закончит свое выполнение как только обе переменные $s1 и $s2 получат значение
ИСТИНА.
Интересный момент заключается в использовании оператора
побитовое И (&) вместо логического И (&&). Левый и правый аргументы
оператора & всегда выполняются в отличие от &&. Этот код просто
не будет работать, если использовать оператор && и файл содержит
строку 'judy' перед строкой 'george'. Конечно, нельзя всегда заменять оператор
&& на &, но в данном случае это необходимо.
Автор: Joseph N. Hall Проверка: если ли в файле все необходимые нам слова.
Это совершенно другой подход. Мы начинает с того,
что создаем анонимные функции, каждая из которых возвращает ИСТИНА, когда
ее аргумент совпадает с одним из искомых слов. Ссылки на функции хранятся
в массиве @match. Затем, для каждой строки входного файла, мы запускаем
по циклу все функции. Если функция не нашла совпадения (искомое слово остутствует)
мы сохраняем ссылку на эту функцию в другом массиве @left_to_match - они
будут работать над следующими строками исходного файла. Когда все функции
сработают, в массиве @left_to_match ничего не останется и программа завершится.
В противном случае будет выдано диагностическое сообщение.
Автор: Joseph N. Hall Попробуем отсортировать по возрастанию числа от 1 до 10. sort 1..10 дает нам результ ('1', '10', '2', '3', '4', '5', '6', '7', '8', '9'). Немного не то... Сортировка сработала как расстановка по алфавиту. Проблему можно решить с помощью оператора <=>.
По умолчанию функция сортировки sort выполняет
расстановку по алфавиту (сортировка в контексте символьных строк). Таким
образом '10' и '100' появятся перед '2' и '3'. Чтобы изменить способ сортировки
в данном случае мы применили собственный оператор сравнения двух переменных
(блок сортировки). Автор: Joseph N. Hall Сортировка одного массива в соответсвии
с содержимым другого массива.
Нам надо отсортировать два "параллельных" массива (списка). Например массив @page состоит из номеров страниц, а @note состоит из примечаний к этим страницам, т.е. $note[$i] - это примечание к странице $page[$i]. Нам хочется напечатать оба массива, отсортировав их по номерам страниц.
Автор: Joseph N. Hall Сортировка по убыванию.
Надо просто поменять местами переменные $a и $b в блоке сравнения.
Автор: Joseph N. Hall Сортировка ключей хэш-массива
в порядке возрастаний их значений.
Имеем хэш-массив, состоящий из слов книги и количеством повторений этих слов. Нам надо напечатать этот массив в порядке убывания частоты слова.
Автор: Joseph N. Hall Сортировка имен файлов по дате/времени
изменения.
Оператор -М возвращает дату/время изменения файла
в виде числа с плавающей точкой. Проблема состоит в том, что оператор
-М выполняется очень медленно и на больших списках файлов операция сортировки
может занять очень много времени. Для сортировки n файлов блок сравнения
будет вызван примерно n log n раз. Для решения этой проблемы смотрите
пример сортировки Шварца. Автор: Joseph N. Hall Сортировка величин, время сравнения
которых сравнительно велико.
Например, нам надо отсортировать файлы по времени последнего изменения, но оператор -М (время последнего изменения файла) работает очень медленно. Решить проблему можно с помощью сортировка Шварца (по имени Рандала Шварца Randal Schwartz).
Суть метода заключается в том, что медленные
вычисления производятся только один раз, а их результат сохраняется во
временном массиве. Дальнейшая сортировка производится над значениями временного
массива. Автор: Joseph N. Hall Сортировка строк по полям, разделенным
символом.
Например, хочу отсортировать строки, разделенные на поля запятой, сначала по второму полю по числам, затем по первому полю по алфавиту в порядке убывания.
На самом деле большая часть приведенного выше
кода - это препроцессор, который готовит данные для дальнейшей сортировки
Шварца. Автор: Joseph N. Hall
|
||||||||||||||||||||
|
Все вопросы и предложения присылайте мне на E-Mail: webmasteram@mail.ru |