ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
1.15. Анализ данных, разделенных запятымиПроблемаИмеется файл данных, поля которого разделены запятыми. Однако в полях могут присутствовать свои запятые (находящиеся внутри строк или снабженные служебными префиксами). Многие электронные таблицы и программы для работы с базами данных поддерживают списки полей, разделенных запятыми, в качестве стандартного формата для обмена данными.РешениеВоспользуйтесь следующей процедурой:sub parse_csv {
КомментарийВвод данных, разделенных запятыми, - коварная и непростая задача. Все выглядит просто, но в действительности приходится использовать довольно сложную систему служебных символов, поскольку сами поля могут содержать внутренние запятые. В результате подстановка получается весьма сложной, а простая функция split /, / вообще исключается. К счастью, модуль Text::ParseWords скрывает от вас все сложности. Передайте функции qoutewords два аргумента и строку разделенных данных. Первый аргумент определяет символ-разделитель (в данном случае - запятая), а второй - логический флаг, который показывает, должна ли возвращаемая строка содержать внутренние кавычки. Если кавычки должны присутствовать внутри поля, также ограниченного кавычками, воспользуйтесь префиксом \: "like \"this\". Кавычки, апострофы и обратная косая черта - единственные символы, для которых этот префикс имеет специальное значение. Все остальные экземпляры \ остаются в итоговой строке. Ниже показан пример использования процедуры parse_csv. q<> - всего лишь хитроумный заменитель кавычек, благодаря которому нам не придется расставлять повсюду символы \.$line = q 1.16. Сравнение слов с похожим звучаниемПроблемаИмеются две английские фамилии. Требуется узнать, звучат ли они похожим образом (независимо от написания). Это позволит выполнять неформальный поиск в телефонной книге, в результатах которого наряду со Smith будут присутствовать и другие похожие имена - например, Smythe, Smite и Smote.РешениеВоспользуйтесь стандартным модулем Text::Soundex:use Text::Soundex; $CODE = soundex($STRING); OCODES = soundex(@LIST); КомментарийАлгоритм soundex хэширует слова (особенно английские фамилии) в небольшом пространстве с использованием простой модели, имитирующей произношение по правилам английского языка. Грубо говоря, каждое слово сокращается до четырехсимвольной строки. Первый символ является буквой верхнего регистра, а прочие - цифры. Сравнивая значения для двух строк, можно определить, звучат ли они похожим образом. Следующая программа предлагает ввести имя и ищет в файле паролей имена с похожим звучанием. Аналогичный подход может использоваться для баз данных имен, поэтому при желании можно индексировать базу данных по ключам soundex. Конечно, такой индекс не будет уникальным.use Text::Soundex;
> Смотри также Документация по стандартным модулям Text::Soundex и User::pwent; man-страница passwd(S) вашей системы; "Искусство программирования", том 3, глава 6. 1.17. Программа: fixstyleПредставьте себе таблицу с парами устаревших и новых слов. Старые слова Новые словаbonnet hood
Программа из примера 1.4 представляет собой фильтр, который заменяет
все встречающиеся в тексте слова из первого столбца соответствующими элементами
второго столбца. При вызове без файловых аргументов программа выполняет
функции простого фильтра. Если в командной строке передаются имена файлов,
то в них помещаются результаты, а прежние версии сохраняются в файлах с
расширениями *.orig (см. рецепт 7.9). При наличии параметра командной строки
-v сообщения обо всех изменениях записываются в STDERR. Таблица пар "исходное
слово/заменитель" хранится в основной программе, начиная с __END__ (см.
рецепт 7.6). Каждая пара преобразуется в подстановку и накапливается в
переменной $code так же, как это делается в программе popgrep2 из рецепта
6.10. Параметр -t выводит сообщение об ожидании ввода с клавиатуры при
отсутствии других аргументов. Если пользователь забыл ввести имя файла,
он сразу поймет, чего ожидает программа.
#!/usr/bin/peri -w # fixstyle - замена строк секции парными
строками # использование: $0 [-v] [файлы...]
_-END__
Пример 1.5. fixstyle2
use strict;
__END__
В новой версии программы каждая строка разбивается на пропуски и слова
(относительно медленная операция). Затем слова используются для поиска
замены в хэше, что выполняется существенно быстрее подстановки. Следовательно,
первая часть работает медленнее, а вторая - быстрее. Выигрыш в скорости
зависит от количества совпадений.
while (<>) {
|