Перловка

применение языка Перл для "домашних" задач обработки данных

Перед каждым из нас периодически возникают "бытовые" задачи обработки данных: упорядочить некий документ или их группу, разложить по полочкам музыкальную коллекцию, провести несложные финансовые подсчёты... Методы решения здесь могут быть различными. Один будет тупо переименовывать файлы вручную и считать столбиком. При наличии компьютера это - очевидная клиника. Другой возьмёт мощную 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) этого элемента. После обсуждения было решено:

  • Вместо тега Program использовать два разных - Complex и Component;
  • Имена комплексов и программ, которые раньше описывались как дочерний элемент, сделать атрибутом элементов Complex и Component. Ту же манипуляцию проделать с программными изделиями и продуктами.

Поскольку у меня уже было несколько готовых XML-файлов, я решил не возиться в них ручками, а... правильно, написать сценарий преобразования. Обратите внимание на строку с операцией замены ~s - она появилась, поскольку для преобразования элемента в атрибут в нём пришлось закодировать все кавычки.

Сценарий достаточно прост, и его можно использовать в качестве готовой "рыбы" для своих повседневных нужд поиска/замены. "Фишка" здесь кроется в том, что критерий замены элемента приходится извлекать из атрибутов этого элемента - традиционный Ctrl+H тут, по всей видимости, бессилен :). Даже с "вордовскими" подстановочными символами, которые на самом деле представляют собой жалкое подобие перловых регулярных выражений.

М.З., 07.09.2003 - 29.09.2004
Viewable With Any Browser Пишите! В начало Designed by
Arachnophilia
Designed by Arachnophilia 4.0