Артефакт

Использование языка Perl и регулярных выражений / 2 марта 2007 г.

Итак, мы с вами уже кое-что умеем.

MS Word, конечно, хорош — может быть, в чём-то и хуже OpenOffice, но зато и бегает побыстрее, и стоит повсюду. Одна беда: реализация регулярных выражений в VBA доброго слова, конечно же, не заслуживает. С другой стороны — сред разработки, поддерживающих RegExpы в полной мере, хватает, но они, как правило, не в состоянии работать со сложным форматированием документа. Как бы нам все эти вкусности объединить в одном решении?..

А вот как.

Perl for Win32

В 1986-м году Larry Wall разработал специальный язык для создания отчётов в среде Unix. Название языку было дано в соответствии с назначением: Perl (Practical Extraction аnd Report Language). Получилось даже благозвучно. По утверждению автора, при создании языка им в первую очередь двигала лень, а значит, инструмент должен был выйти неплохой.

Упомянутые «отчёты» представляли (и до сих пор представляют) собой текстовые файлы, иногда — очень большого объёма. Таким образом, Perl с самого начала позиционировался как язык для обработки текстов. Понятно, что под Unixом такой замечательный инструмент не засиделся: через несколько лет после появления Perl был портирован на платформу Windows, благодаря чему мы с вами, мышевозы и виндузятники, можем насладиться всеми предоставляемыми им возможностями, а в первую очередь — полноценным синтаксисом регулярных выражений, лучше которых для текста пока ещё ничего не придумано.

Диалект Perl, о котором я поведу речь, называется ActivePerl, и его совершенно бесплатно можно скачать с сайта ванкуверской компании ActiveState.

Не думайте, что я собираюсь всерьёз учить вас программировать. Всё, что мне известно о Perl, не покрывает и десятой доли его возможностей. Я просто предлагаю к рассмотрению парочку скриптов, которые мне как текстовому процессору показались очень удобными и полезными. Если же кто-то захочет узнать немного больше — добро пожаловать в «Уроки веб-дизайна», один из которых как раз и посвящён азам упомянутого языка.

Установка и настройка

Тут особенно мудрить нечего. Качаем инсталлятор Perl и запускаем его, указав C:\Perl в качестве директории для установки. Если вам по какой-то причине приспичило инсталлировать ActivePerl в другое место, в скриптах, о которых пойдёт речь дальше, придётся поменять первую строчку

#!C:/Perl/bin/Perl.exe

на соответствующую выбранному вами пути. Заметьте, что слеши (/) должны быть прямыми, а не обратными (\), к которым вы привыкли под Windows.

Что же до настройки, то тут всё тоже не очень сложно. Если вдруг скрипты не заработают, запустите из командной строки ppm (Perl Package Manager) и добавьте отсутствующий в системе модуль Win32::OLE с помощью команды install. В общем, даже и останавливаться на этом не буду, настолько всё элементарно. Если вдруг возникнут проблемы, почитайте вот это.

Кроме того, нам с вами понадобится некий файл с шаблоном документа, который я выложу в конце статьи. Зачем — объясню чуть позже.

Скрипты Perl представляют собой простые текстовые файлы с расширением .pl, первой строкой (!) которых обязательно является shebang, говоря иначе — та самая строчка, о которой шла речь двумя абзацами выше.

Между прочим, ставить Perl, конечно, вы вовсе не обязаны: в конце статьи я собираюсь выложить и бинарные версии скриптов, не требующие никаких инсталляций. Но... как всегда, есть как минимум одно «но». Такие скрипты вы не сможете редактировать. То есть, конечно, можно будет запускать их во славу Аллаха, если мои задачи, для которых они писались, вас полностью устраивают. А если нет? Решайте сами.

Запуск макросов Word из скриптов Perl

Делается это так:

#!C:/Perl/bin/perl.exe
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Word';
...
$word = Win32::OLE->new('Word.Application','Quit');
$doc = $word->Documents->Open("C:/template.doc");
$word->Run("Paragraph");
$doc->SaveAs("C:/newfile.doc");
$doc->{Saved} = 1;
$doc->Close;

Не пугайтесь, ничего страшного тут нет. Обратите внимание на седьмую строчку. Именно в ней интерпретатор Perl, к этому моменту уже запустивший Word и открывший документ template.doc, запускает макрос Paragraph, записанный вами ранее. В общем, уже почти бинго.

Переходим к практике

Давайте наконец выясним, чего нам удалось добиться.

Perl запускает Word и прогоняет некий макрос. Отлично! Но, собственно, зачем? Мы прекрасно могли бы открыть Word, войти в меню Tools | Macros и обойтись без разных подозрительных языков. Более того, на VBA вполне можно запрограммировать пакетную обработку, при которой последовательно будут открываться и изменяться, скажем, все файлы из определённой директории. Так зачем городить огород?

Наверное, пора рассказать, откуда растут ноги у всей этой истории.

Как я уже писал, многие книжки для своей библиотеки я брал у Максима Мошкова: не ради дурацкого дублирования, а потому, что меня не устраивал вид, в котором они хранились на Lib.ru.

Книжек было много, соответственно — требовалось обрабатывать их пакетно, что VBA мог. Задачки по приведению текстов к нормальному виду иногда стояли очень интересные, и требовался синтаксис регулярных выражений, VBA недоступный. Плюс кое-какие баги, в основном с ^13, частично описанные в предыдущей статье. Тогда и появилась идея разделения обязанностей: я хотел заставить VBA и Perl работать вместе так, чтобы каждый из них делал то, на что он лучше всего способен.

Задачу я поставил следующим образом: поскольку исходным материалом чаще всего являются текстовые файлы, пусть их открывает написанный на Perlе скрипт, он же производит основную правку, а потом уже отдаёт файлы Wordу, который форматирует каждый текст уже по возможности ближе к конечному виду.

Как ни странно, получилось неплохо. Настолько неплохо, что иногда я даже низвожу до текстового формата некоторые найденные в Сети .doc или .rtf-файлы (конечно, пометив предварительно болды-италики, чтоб не потерять их) и прогоняю их через получившуюся систему обработки с целью устранения всяких глюков и вывертов, на которые оба формата способны.

Расскажу по порядку, что делает один из скриптов.

1. Читает все текстовые (.txt) файлы из каталога. Я обычно сваливаю поименованные файлы в ту папку, в которой лежит скрипт, запускаю последний и жду, пока он отжурчит (иногда это занимает несколько минут, всё зависит от количества и размера файлов).

2. Открывает каждый файл, читает его содержимое, обрабатывает его с помощью регулярных выражений, проделывая всё, что может Perl и чего не может VBA, в основном это всякие процедуры на границе абзацев. После этого файл отдаётся Wordу. Тот открывает шаблон template.doc, вставляет в него частично обработанный текст, а затем честно прогоняет макросы Paragraph и Dashes, которые обязательно должны присутствовать в общем списке макросов Wordа (можно использовать любые макросы, но их должно быть два, и именно с такими названиями; если какой-то из них вам не нужен, создайте пустой макрос, чтобы избежать прекращения работы скрипта из-за ошибки времени выполнения (runtime error)).

3. Сохраняет документ с расширением .doc и тем же именем, что было у исходного текстового файла, и берётся за следующий. И так до конца списка.

Вот такие дела.

Инструкция по эксплуатации

Для того, чтобы привести систему в работоспособное состояние, нужно очень немногое.

1. Установленный Perl со всеми необходимыми модулями (повторяю, можно обойтись бинарными скриптами, но в этом случае вы не сможете ничего менять).

2. Пустой каталог, куда вы поместите скрипты и куда будете складывать предназначенные для обработки текстовые файлы.

3. Подкаталог tools, в котором должен находиться файл template.doc

Для тестирования всего вышеперечисленного достаточно положить в каталог со скриптами хотя бы 1 (один) текстовый файл и запустить один из двух скриптов. Первый предназначен для обработки текстов с условным разбиением на абзацы, второй — для безусловного разбиения. Всё. Будут ошибки или проблемы — пишите. Как работают сами скрипты — очень подробно написано в комментариях. Текстовый файл для тестирования лучше взять у Максима Мошкова.

Скрипты к статье

procTextsSpacedParsPl (для текстов с условной разбивкой)
procTextsRegularParsPl (для текстов с безусловной разбивкой)
procTextsSpacedParsBin (для текстов с условной разбивкой, бинарник)
procTextsRegularParsBin (для текстов с безусловной разбивкой, бинарник)
template.doc (шаблон для каталога /tools)

...

«Форматирование абзацев» | «Заголовки»

Новости раздела

4 августа 2008 г.
Copy Editing: последняя часть

Ещё на сайте

Библиотека
Языки
Друзья
Канада
Авторский угол

Интернет

CPAN
Citforum
W3C.org
useit.com
Типомания
Code Charts
ру/ководство
Лаборатория dk
WebReference.com
Спецификация Perl
Заметки HTML-кодера
Анатомия Adobe Photoshop
The Apache Software Foundation


Рейтинг@Mail.ru

wordpress statistics

Рейтинг@Mail.ru