применение языка Перл для "домашних" задач обработки данных
Перед каждым из нас периодически возникают "бытовые" задачи обработки данных: упорядочить некий документ или их группу, разложить по полочкам музыкальную коллекцию, провести несложные финансовые подсчёты... Методы решения здесь могут быть различными. Один будет тупо переименовывать файлы вручную и считать столбиком. При наличии компьютера это - очевидная клиника. Другой возьмёт мощную IDE (Delphi, Visual C++...) и начнёт писать универсальную программу. Это уже несколько лучше, однако сплошь и рядом оказывается, что временнЫе затраты на создание программы... превышают время на решение задачи первым способом. Я не касаюсь вопроса лицензионной чистоты (в наших условиях это пока неактуально), но кто знает...
Данный материал призван проиллюстрировать третий, компромиссный путь - использование скриптовых языков. Автор выбрал Перл - пожалуй, наиболее известный язык из этой категории. Альтернативами можно считать Питон (многие его любят, но не я: считаю, что группирование операторов посредством отступов способно создать тяжёлые ошибки) и VBScript (это средство, жёстко привязанное к M$ Windows, я отмёл сразу).
Должен признаться, что будучи сторонником классического стиля программирования и классических же, строго типизированных языков, таких как АЛГОЛ, Паскаль, Модула-2, я вообще-то недолюбливаю скриптовые. Но если речь идёт не про написание "нетленки" вроде ядра ОС, СУБД, или хотя бы офисного пакета, а про решение узко бытовой задачи, их использование вполне оправдано.
Поначалу Перл создавался как мощное средство генерации отчётов. Основным его применением до сих пор считалось написание CGI-сценариев для придания активности интернет-сайтам. Однако, как сказано в одной книжке, "Перл - это не только CGI". Сегодня в CPAN - официальном архиве Перл-библиотек - можно встретить даже такую "экзотику" как редактирование тегов в музыкальных файлах MP3. А как показал мой опыт, это совсем никакая не экзотика, а очень полезная возможность.
Если на Вашем компе стоит linux (или большинство других юниксов), перл у Вас, скорее всего, уже установлен. Счастливым же обладателям Windows придётся сходить на www.activestate.com и взять там продукт под названием Active Perl. (Дополнение: на самом деле, для Windows есть ещё Strawberry Perl, который ближе к оригинальному юниксовому.)
Ниже приведены примеры Перл-сценариев, которые помогли конкретно мне при решении конкретных же жизненных задач. Если будете скачивать - уберите символ подчёркивания после расширения .pl, я его поставил только из-за того, что на это расширение очень неравнодушно реагирует Apache :).
mts2csv.pl |
Сценарий преобразовывает Детализированный отчёт по балансу (формат HTML), присылаемый по электронной почте Интернет-службой сервиса абонента (ИССА) корпорации МТС, в более удобоваримый формат CSV. Собственно, HTML (в оригинале) - это тоже довольно удобный формат. Но не в интерпретации ИССА! Заглянув в код и офигев от количества плохо состыкованных между собой COLSPAN-ов, я испытал странное чувство: когда-то я это уже видел... И точно: в начале файла обнаружился комментарий "Created by Oracle Developer/2000 Reports". Ну, по части варварского обращения с HTML с этим генератором отчётов действительно мало что может сравниться. А CSV-файл Вы можете "скормить" своей любимой (практически любой) электронной таблице, будь то ksppread или M$ Excel и дальше анализировать сколько влезет. Сценарию на вход подаётся 2 параметра: имя входного HTML-файла и имя выходного CSV-файла. Обратите внимание, что входной файл МТС формирует в кодировке CP1251, поэтому, если у Вас юникс, то перед запуском сценария надо запустить iconv и перетаранить отчёт в КОИ-8. В Windows никаких предварительных действий не потребуется. А казалось бы чего проще: предусмотреть в ИССА наряду с форматами HTML и PDF ещё и XML! Это бы облегчило анализ на порядок. А так - народ лепит левый софт типа MTSDetail для приведения всей этой байды в божеский вид. Оно, конечно, MTSDetail для робкого пользователя, который шарахается от командной строки, проще, чем мой сценарий. Но у мего подхода есть три плюса: 1) сценарий прозрачен, не надо бояться вирусов или троянов; 2) если МТС что-то доработает в формате, сценарий легко поправить, а пользователю MTSDetail придётся ждать с протянутой рукой новой версии; 3) работает под любой операционкой, где есть Перл. |
mp3sorter.pl |
Этот сценарий вряд ли пригодится Вам без изменений, но сама идея... Короче, попал мне года полтора назад в руки сидюк "Romantic Collection: золотая коллекция", содержащий собрание песен в формате MP3. Причём песни со всех альбомов были свалены в один каталог и имели имена формата TRACKNNMM, где NN - номер альбома, MM - номер песни. ID3 тегов в файлах тоже не наблюдалось. Предполагалось, что упорядоченные названия песен будут видны через оболочку, которая, кстати, защищена паролем. Питая отвращение к необходимости устанавливать левые проги для прослушивания музыки стандартного, в общем-то, формата, я решил привести файлы в порядок (а было их нескольо сотен). Зацепка нашлась: помимо самих песен к каждому альбому прикладывался html-файл с ссылками на песни. Написанный мной сценарий извлекает из этих файлов названия, переименовывает файлы по названиям песен и раскидывает их по каталогам с альбомами, которые сам же и создаёт. Только этого мне показалось мало: я решил ещё и ID3 теги по файлам расставить. Для чего скачал со CPAN модуль MP3::Info и слегка доработал сценарий. В результате на выходе программы я имею аккуратную, разложенную по полочкам музыкальную коллекцию + чувство здорового удовлетворения, что вместо дурной работы по раскладыванию и редактированию файлов вручную я освоил новый язык (сценарий был написан за один вечер, а сейчас я бы это сделал гораздо быстрее). |
ss_conv.pl |
А вот пример попроще - простая замена ключевых слов в файле. В данном случае XML-файле. История такова. Делал я как-то XML с описанием структуры программного обеспечения в терминах ЕСПД. И был там у меня элемент Program, который может описывать как комплекс, так и компонент, причём разница была скрыта в одном из атрибутов (rang) этого элемента. После обсуждения было решено:
Поскольку у меня уже было несколько готовых XML-файлов, я решил не возиться в них ручками, а... правильно, написать сценарий преобразования. Обратите внимание на строку с операцией замены ~s - она появилась, поскольку для преобразования элемента в атрибут в нём пришлось закодировать все кавычки. Сценарий достаточно прост, и его можно использовать в качестве готовой "рыбы" для своих повседневных нужд поиска/замены. "Фишка" здесь кроется в том, что критерий замены элемента приходится извлекать из атрибутов этого элемента - традиционный Ctrl+H тут, по всей видимости, бессилен :). Даже с "вордовскими" подстановочными символами, которые на самом деле представляют собой жалкое подобие перловых регулярных выражений. |
Пишите! | Arachnophilia |