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


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


Комментарий

Как объяснялось во введении к этой главе, при наличии модификатора /д в ска­лярном контексте происходит многократный поиск. Его удобно использовать в циклах while — например, для подсчета совпадений в строке:

# Простой вариант с циклом while
$count = 0,

while($strmg =" /PAT/g) {

$count++,   # Или что-нибудь другое

}

# То же с завершающим циклом while
$count = 0

$count++ while Sstnng =~ /PAT/g

#  С циклом for

for (Scount = 0,   Sstring =" /PAT/g,   $count++)  {  }

#  Аналогично,   но с подсчетом перекрывающихся совпадений
$count++ while $stnng =" /(7=PAT)/g

Чтобы найти N-й экземпляр, проще всего завести отдельный счетчик Когда он достигнет N, сделайте то, что считаете нужным. Аналогичная методика может применяться и для поиска каждого N-ro совпадения — в этом случае проверяет­ся кратность счетчика N посредством вычисления остатка при делении. Например, проверка (++$count % 3) == 0 находит каждое третье совпадение.

Если вам не хочется брать на себя дополнительные хлопоты, всегда можно из­влечь все совпадения и затем выбрать из них то, что вас интересует.

$pond =   One fish two fish red fish blue fish ,

#  С применением временного массива

©colors = ($pond =" /(w+)\s+fish\b\gi),    # Найти все совпадения
$color = $colors[2],                                       # Выбрать одно,

# интересующее нас

#  Без временного массива

Scolor = ( $pond =~ /(\w+)\s+fish\b/gi )[2], # Выбрать третий элемент

print The third fish is the pond is Scolor \n The third fish in the pond is red.

В другом примере находятся все нечетные совпадения:

Scount = 0,

$_ = One fish two fish red fish blue fish ,

@evens = grep {$count++ % 2 == 1} /(\w+)\s+fish\b/gi,

print Even numbered fish are @evens \n ,

Even numbered fish are two blue.

При подстановке заменяющая строка должна представлять собой программ­ное выражение, которое возвращает соответствующую строку. Не забывайте воз­вращать оригинал как заменяющую строку в том случае, если замена не нужна. В следующем примере мы ищем четвертый экземпляр fish и заменяем предше­ствующее слово другим:




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



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