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


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


$stnng =    And little lambs eat ivy»,

$stnng =~ /l["s]*s/,

print    ($ )   ($&)   ($  )\n  ,

(And   )   (little  lambs)   (   eat  ivy)

Переменные $', $& и $' соблазнительны, но опасны. Само их присутствие в лю­бом месте программы замедляет поиск по шаблону, поскольку механизм должен присваивать им значения при каждом поиске. Сказанное справедливо даже в том случае, если вы всего один раз используете лишь одну из этих переменных, — или даже если они совсем не используются, а лишь встречаются в программе. В вер­сии 5.005 переменная $& перестала обходиться так дорого.

После всего сказанного возникает впечатление, что шаблоны могут все. Как ни странно, это не так (во всяком случае, не совсем так). Регулярные выражения в принципе не способны решить некоторые задачи. В этом случае на помощь при-


6.1. Копирование с подстановкой   185

ходят специальные модули. Скажем, регулярные выражения не обладают средства­ми для работы со сбалансированным вводом, то есть любыми данными произ­вольной вложенности — например, парными скобками, тегами HTML и т. д. Для таких целей приходится строить настоящий анализатор наподобие HTML::Parser из рецептов главы 20 «Автоматизация в Web». Еще одна задача, не решаемая шаб­лонами Perl, — неформальный поиск. В рецепте 6.13 показано, как она решается с помощью специального модуля.

6.1. Копирование с подстановкой

Проблема

Вам надоело многократно использовать две разные команды для копирования и подстановки.

Решение

Замените фрагменты вида:

$dst = $src,

$dst =" s/this/that/,

следующей командой:

($dst = $src) =~ s/this/that/,

Комментарий

Иногда подстановка должна выполняться не в исходной строке, а в ее копии, од­нако вам не хочется делить ее на два этапа. Например:

# Выделить базовое имя
(Sprogname = $0)    =~ s'~ ¦/''.

#  Начинать Все Слова С Прописной Буквы
($capword = Sword)   =" s/(\w+)/\u\L$1/g,

#  /usr/man/man3/foo .1 заменяется на /usr/man/man/cat3/foo 1
(Scatpage = $manpage) =~ s/man(9=\d)/cat/,




Начало  Назад  Вперед



Книжный магазин