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



              

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



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

$count = 0

s{

\b

(

\w+)

\s+ fish

\b

Я

if

(++$count

==

4) {

sushi

$2,

}

else {

$1

$2

}gex

One

fish two

fish

red fish sushi fish

Задача поиска последнего совпадения также встречается довольно часто Про­стейшее решение — пропустить все начало строки Например, после / *\b(\w+)\s+ f ish\b/ переменная $1 будет содержать слово, предшествующее последнему экземп­ляру   fish .

Другой способ — глобальный поиск в списковом контексте для получения всех совпадений и последующее извлечение нужного элемента этого списка

$pond = One fish two fish red fish blue fish swim here $color = ( $pond =~ /\b(\w+)\s+fish\b/gi )[-1], print Last fish is $color \n , Last fish is blue.

Если потребуется найти последнее совпадение без применения /д, то же самое можно сделать с отрицательной опережающей проверкой (?l НЕЧТО) Если вас ин­тересует последний экземпляр произвольного шаблона А, вы ищете А, сопровож­даемый любым количеством «не-А», до конца строки Обобщенная конструкция имеет вид А(9!   *А) *$, однако для удобства чтения ее можно разделить

т{

А        # Найти некоторый шаблон А

С1       # При этом не должно находиться

¦    # что-то другое А     # и А )

$       # До конца строки }х

В результате поиск последнего экземпляра   fish   принимает следующий вид:

$pond =   One fish two fish  red fish blue fish if ($pond =" m{

\b    (    \w+) \s+ fish \b C'     * \b fish \b ) }six ) {

print    Last fish is $1/\n } else <


6.6. Межстрочный поиск   193

print    Failed'\n ,

}

Last  fish  is   blue.

Такой подход имеет свои преимущества — он ограничивается одним шаблоном и потому подходит для ситуаций, аналогичных описанной в рецепте 6.17. Впро­чем, имеются и недостатки. Он однозначно труднее записывается и воспринима­ется — впрочем, если общий принцип понятен, все выглядит не так плохо. К тому же это решение медленнее работает — для протестированного набора данных бы­стродействие снижается примерно в два раза.




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