regulyarnyie-vyirazheniya-osnovyi (852744), страница 19
Текст из файла (страница 19)
9.1. Отображение файла r ime. h tml в браузере FirefoxПреобразование простоrо текста с помощью PerlНиже будет показано, как разметить простой текст тегами HTML с помощью Perl. Каки в случае примеров, в которых использовался редактор sed, сначала будут представленыодиночные команды, и уже после этого мы соберем их в одном командном файле.В этой книге вводятся лишь самые элементарные средства Perl и способыих использования. Это не учебник и не руководство по использованию языка Perl, но я надеюсь, что мне удастся пробудить в вас интерес к этому языкуи продемонстрировать некоторые его возможности.
Если вы хотите изучитьPerl, то вам имеет смысл начать с посещения учебного сайта Perl по адресуhttp: / / learn. perl. org, на котором также описана процедура установкисоответствующего проrраммного обеспечения.108Глава 9. Разметка документа тегами HTMLSЕсли текущей строкой($.) является строка l, назначьте всю строку($_) переменной$title и выведите ее.perl -пе 'if ($. == 1) {chomp($title $ ) ; print�"<hl>" . $title .
"</hl>" ."\n";};'rime.txtВ случае успешного выполнения этой команды результат должен быть таким:<hl>THE RIME OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</hl>Ниже приведено описание работы этой команды Perl.•••Проверить с помощью функции$, является ли строка l текущей.Захватить строку $( _) и назначить ее переменной $t it l е. Когда функцияchomp захватывает строку, она удаляет из нее концевой символ новой строки.Вывести переменную $title в составе элемента hl, добавив в конце символ новой строки (\n).Для получения более подробной информации о таких встроенных функцияхPerl, как$., выполните команду perldoc -v $.( обычно perldoc устанавливается одновременно с Perl). Если это не сработает, обратитесь к разделу"На заметку':Чтобы добавить в начало файла разметку, включая тег hl, выполните следующую команду.perl -пе 'if ($.
== 1) {chomp($title = $_) };print "<!DOCTYPE html>\<html xmlns= \"http://www.wЗ.org/1999/xhtml\">\<head>\<title>$title</title>\<meta charset= \"utf-8\"/>\</head>\<body>\<hl>$title</hl>\n" if $. == 1; exit' rime.txtВ результате вы получите следующий вывод.<!DOCTYPE html><html xmlns= "http://www.wЗ.org/1999/xhtml"><head><title>THE RIМE OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</title><meta charset=\"utf-8\"/></head><body><hl>THE RIME OF ТНЕ ANCYENT МARINERE, IN SEVEN PARTS.</hl>Функция print выводит последующие теги, и за каждой строкой следует символ\, который вводит символ новой строки в выходной поток.
Содержимое переменной$title помещается в элементы title и hl.Гnава 9. Разметка документа тегами HTMLS109Обработка римских цифр с помощью PerlЧтобы снабдить тегами заголовок и римские цифры, которыми обозначаются разделы, выполните следующую команду:perl -ne 'print if s/ л (ARGUМENT\. II{O,З}V?I{0,2}\.)�$/<h2>\1<\/h2>/;' rime.txtВот ее вывод.<h2>ARGUМENT.</h2><h2>I.</h2><h2>II.</h2><h2>III.</h2><h2>IV.</h2><h2>V.</h2><h2>VI.</h2><h2>VII.</h2>Команда подстановки (s) захватывает заголовок ARGUMENT и семь римских цифр от Iдо VII в верхнем регистре, каждый раз дополняя захваченный текст точкой в конце и заключая его в элемент h2.Обработка отдепыоrо абзаца с помощью PerlПроверив, что номер строки равен 5, заключите вступительный абзац в элемент рс помощью следующей команды:perl -ne 'if ($.
== 5) {s/ л ([A-Z].*)�$/<p>$1<\/p>/;print;}' rime.txtРезультат ее применения должен быть таким.<p>How а Ship having passed the Line was driven Ьу Stormsto the cold Country towards the South Pole; and how fromthence she made her course to the tropical Latitude of theGreat Pacific Ocean; and of the strange things that befell;and in what manner the Ancyent Marinere came back to hisown Country.</p>Обработка строк поэмы с помощью PerlПриведенная ниже команда вставляет открывающий тег р в начале первой строкипоэмы, а тег Ь r - в конце этой строки.perl -ne 'if ($.
== 9) {s/ л [ ]*(.*)/ <p>$1<br\/>/;�print;}' rime.txtВ результате мы получаем такую строку:<p>It is an ancyent Marinere,<br/>Следующая команда Perl преобразует строки с номерами от 1 О до 832, добавляя тегbr в конце каждой строки:perl -ne 'if (10 .. 832) { s/ л ([ ]{5,7}.*)/$1<br\/>/;�print;}' rime.txt110Гnава 9. Разметка документа тегами HTMLSНиже в качестве примера приведена часть преобразованного текста.Farewell, farewell! but this I tell<br/>То thee, thou wedding-guest! < br/>Не prayeth well who loveth well < br/>Both man and bird and beast.
<br/>Добавим закрывающий тег р в конце последней строки поэмы:perl -ne 'if ($. == 833) {s/ л (.*)/$1 < \/р>/; print;)' rime.txtВот как выглядит результат:Не rose the morrow morn. < /p>Замените пустые строки в конце каждой строфы тегами br:perl -ne 'if (9..eof) {s/ л $/ < br\/>/; print;)' rime.txtчто приведет к показанному ниже результату.< br/>Не prayeth best who loveth best,All things both great and small:For the dear God, who loveth us,Не made and loveth all.< br/>The Marinere, whose еуе is bright,Whose beard with age is hoar,Is gone; and now the wedding-guestTurn'd from the bridegroom's door.< br/>И в завершение выведем пару тегов по достижении конца файла:perl -ne 'if (eof) {print " < /body>\n < /html>\n");' rime.txtГораздо легче организовать работу всего кода, объединив его в одном файле, к чемумы сейчас и переходим.Испоnьзование командноrо файnа в PerlНиже приведен листинг файла html.pl, который содержит команды, преобразующиефайл rime.txt в НТМL-документ с помощью Perl.
Выноски помогут вам проследить затем, что происходит в данном сценарии.# ! /usr/Ьin/perl -р Оif ($ • == 1 ) { 8chomp ($title = $_);)print " <! DOCTYPE html>\ @< html xmlns = \"http://www.w3.org/1999/xhtml\">\< head>\< title>$title < /title>\< meta charset=\"utf-8\"/>\</head>\< body>\Глава 9. Разметка документа тегами HTMLS111<hl>$title</hl>\n" if $.
== 1;s/ л (ARGUМENTII{0,3}V?I{0,2})\.$/<h2>$1<\/h2>/; Оif ($. == 5 ) { 0s/ л ([A-Z] .*)$/<р>$1<\/р>/;}if ($. == 9 J { Фs/ л [ ]*(.*)/ <p>$l<br\/>/;}if (10 .. 832) { &s/ л ([ ]{5,7} .*)/$l<br\/>/;}if (9 ..eof) { Оs/ л $/<br\/>/;}if ($. == 833) { 0s/ л (.*)$/$1<\/p>\n <\/body>\n<\/html>\n/;}О Первая пара символов ( # ! - магическая строка) указывает интерпретатору команд на то, что данный файл является программой; оставшаяся часть первой строки задает местоположение программы, которую вы хотите выполнить.8 Если текущая строка ($.) является строкой 1, назначить всю строку ($_) переменной $ti tle, попутно удаляя последний символ строки (символ новой строки)с помощью функции chomp.О Вывести тип документа и некоторые НТМL-теги в начале документа в строкеи повторно использовать значение переменной $ti tle в нескольких местах.8 Поместить заголовок ARGUMENT и римские цифры в элементы h2.О Окружить вступительный абзац тегами р.0 Вставить открывающий тег р в начале первой строки стиха, а тег br - в концеэтой строки.& Вставить тег br в конце каждой строки, за исключением последней.О Заменить каждую пустую строку после строки 9 тегом br.0 Вставить в конце последней строки закрывающие теги р, body и html.Чтобы выполнить данную программу, введите следующую команду:perl html.pl rime.txtВы также можете воспользоваться возможностью перенаправления для сохранениявывода в файле с помощью выражения а >.
Следующая глава завершает данное краткоеруководство по регулярным выражениям.О чем вы узнаяи в rяаве 9• Как использовать редактор sed в командной строке.• Как вставить, заменить и присоединить текст (теги) с помощью редактора sed.• Как использовать Perl для выполнения тех же операций.112Гnава 9. Разметка документа тегами HTMLSНа заметку• Утилита AsciiDoc (http://www.methods. со.nz/asciidoc), написанная Стюартом Рэкхемом, позволяет конвертировать обычные текстовые файлы в форматы HTML, PDF, ePUB, DocBook и тап с помощью процессора Python. Синтаксисдля текстовых файлов аналогичен синтаксису Wiki и Markdown и обеспечиваетгораздо более быструю подготовку документов по сравнению с ручным кодированием тегов HTML или ХМL.• Символ подчеркивания может применяться только в документах XML, но неHTML. Кроме того, диапазон символов, использование которых в именах допускается стандартом ХМL, намного шире того, который представлен набором ASCII.Более подробно об использовании символов в именах ХМL можно прочитатьпо адресу http://www.wЗ.org/TR/REC-xml/#sec-common-syn.• Если команда perldoc не сработает, в вашем распоряжении есть альтернативныеварианты.
Прежде всего, можете прочитать онлайновую документацию на сайтеhttp://perldoc.perl. org. (Например, для того чтобы узнать больше о переменной $., откройте страницу http://perldoc.perl.org/perl var.html#VariaЫes-related-to-filehandles.) Если вы работаете на компьютере Мае, попробуйте использовать версию perldoc5 .12. Если вы установилиPerl из ActiveState, то эта версия должна находиться в каталоге /usr/local/Active Ре r1-5 .ХХ/Ьin. В случае установки путем компиляции исходного кода какperl, так и perldoc устанавливаются в каталоге /usr /local /Ьin. Чтобы perlи perldoc запускались, добавьте путь /usr/local/Ьin в переменную РАТН. Более подробную информацию относительно установки значений переменной РАТНможно получить по адресу http://java.com/en/download/help/path. xml.Глава 9. Разметка документа тегами HTMLS113ГЛАВА 10Конец начаnа"UNIX не был создан для того, чтобы не датькому-то делать глупости, ведь это помешало быумным людям делать умные вещи".- Дуглас ГвинПримите поздравления в связи с тем, что у вас хватило терпения дочитать книгудо этой страницы.