Программируемые инструменты
Для подобных инструментов применяют общий термин – языки скриптов (scripting languages). Такое название объясняется их происхождением ранних командных интерпретаторов, вся "программируемость" которых ограничивалась исполнением заранее записанных "сценариев" script) программ. Языки скриптов позволяют использовать регулярные выражения более творчески: не только для поиска соответствий шаблону – простого обнаружения соответствия, но и для определения участков текста, которые должны быть изменены. Именно это осуществляется в двух командах regsub (от regular expression substitution – замена с помощью регулярных выражений), реализованных в приводимой ниже программе на языке Tel.
Программа эта является несколько более общей формой программы из главы 4, получающей биржевые котировки; новая версия выполняет это, получая данные из URL, передаваемого ей в качестве первого аргумента. Первая замена удаляет строку http://, если она присутствует; вторая – удаляет символ / и заменяет его пробелом, разбивая, таким образом, аргумент на два поля. Команда lindex получает поля из строки (начиная с индекса 0). Текст, заключенный в квадратные скобки, выполняется как команда Tel и заменяется результирующим текстом; последовательность $х заменяется значением переменной х.
Этот скрипт, как правило, производит весьма объемистый вывод, большую часть которого составляют тэги HTML, заключенные между < и >. Perl удобен для текстовых подстановок, так что нашим следующим инструментом станет скрипт на Perl, который использует регулярные выражения и подстановки для удаления тэгов:
Для тех, кто не знаком с Perl, этот код будет загадкой. Конструкция:
$str =" s/regexp/repl/g
Строке str подставляет строку repl вместо текста, соответствующего регулярному выражению readexp (берется крайне левое максимальное соответствие); завершающий символу (от "global") означает, что действия надо произвести глобально, для всех найденных соответствий, и не только для первого. Последовательность метасимволов \s является сокращенным обозначением символа пустого места (пробел, знак табуляции, символ перевода строки и т. п.); Это означает перевод строки. Строка " " – это символ HTML, как и те, о которых мы упоминали в главе 2, он означает non-breakable space – неразрывный пробел.
Собрав все написанное воедино, мы получим совершенно идиотский, но функционирующий web-браузер, реализованный как скрипт командного интерпретатора, состоящий из одной строки:
Такой вызов получит web-страницу, отбросит все управление и форматирование и отформатирует текст по своим собственным правилам. Получился быстрый способ достать страницу текста из web.
Отметьте, что мы неспроста использовали сразу несколько языков (Tel, Perl, Awk) и в каждом из них – регулярные выражения. Собственно говоря, мощь различных нотаций и состоит как раз в подборе наилучшего варианта для каждой проблемы. Tel особенно хорош для получения текста из сети, Perl и Awk прекрасно редактируют и форматируют текст, а регулярные выражения – отличный способ определения фрагментов текста, которые должны быть найдены и изменены. Объединение всех этих языков получается гораздо более мощным, чем любой из них в отдельности. Целесообразно разбить задачу на части, если можно выиграть за счет составления правильной нотации в каждой из них.