PERL: БИБЛИОТЕКА ПРОГРАММИСТА



              

PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 186



194   Глава 6 • Поиск по шаблону

водом строки. Эти модификаторы можно использовать вместе, они не являются взаимоисключающими.

Фильтр из примера 6.2 удаляет теги HTML из всех файлов, переданных в @ARGV, и отправляет результат в STDOUT. Сначала мы отменяем разделение записей, чтобы при каждой операции чтения читалось содержимое всего файла. Если @ARGV содержит несколько аргументов, файлов также будет несколько. В этом случае при каждом чтении передается содержимое всего файла. Затем мы удаляем все открывающие и закрывающие угловые скобки и все, что находится между ними. Мы не можем просто воспользоваться * по двум причинам: во-первых, этот шаб­лон не учитывает закрывающих угловых скобок, а во-вторых, он не поддерживает межстрочных совпадений Проблема решается применением *'в сочетании с модификатором /s — по крайней мере, в данном случае.

Пример 6.2. killtags

#'/usr/bin/perl

# killtags - очень плохое удаление тегов HTML

under" $/        # При каждом чтении передается весь файл

while (<>) {    # Читать по одному файлу

s/< *?>//gs  # Удаление тегов (очень скверное)

print        # Вывод файла в STDOUT
>

Шаблон s/<[">]*>//g работает намного быстрее, но такой подход наивен: он приведет к неправильной обработке тегов в комментариях HTML или угло­вых скобок в кавычках (<IMG SRC= here gif ALT= <<0oh la la1» >). В рецеп­те 20 6 показано, как решаются подобные проблемы.

Программа из примера 6.3 получает простой текстовый документ и ищет в нача­ле абзацев строки вида Chapter 20 Better Living Through Chemisery . Такие строки оформляются заголовками HTML первого уровня. Поскольку шаблон по­лучился довольно сложным, мы воспользовались модификатором /х, который разрешает внутренние пропуски и комментарии.

Пример 6.3. headerfy

#Vusr/bm/perl

#  headerfy    оформление заголовков глав в HTML


$/ =

while ( <>

) {

#

Получить абзац

s{

\A

#

Начало записи

(

#

Сохранить в $1

Chapter

#

Текстовая строка

\s+

Обязательный пропуск

\d+

#

Десятичное число

\s*

#

Необязательный пропуск

#

Двоеточие

*

Все, кроме перевода строки,

}{<H1>$K/H1>}gx,

print




Содержание  Назад  Вперед