PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 179
while (<DATA>) {
6 3 Поиск слов 187
chomp
if (/T\W\dJ+$/) }
print $_ alphabetic\n } else [
print $_ line noise\n
__END__ silly fa3ade couperate nico Renne Molmre hxanoglobin nanve tschbfl random1stuff#here
> Смотри также---------------------------------------------------------------------------------------------
Описание работы с локальным контекстом в perllocale(l), страница руководства /оса/е(3) вашей системы, рецепт 6 12
6.3. Поиск слов
Проблема
Требуется выделить из строки отдельные слова
Решение
Хорошенько подумайте, что должно считаться словом и как одно слово отделяется от остальных Затем напишите регулярное выражение, в котором будут воплощены ваши решения Например
/\S+/ # Максимальная серия байтов не являющихся пропусками /[A-Za z -]+/ # Максимальная серия букв апострофов и дефисов
Комментарий
Концепция «слова» зависит от приложения, языка и входного потока, поэтому в Perl не существует встроенного определения слов Слова приходится собирать вручную из символьных классов и квантификаторов, как это сделано выше Во втором примере мы пытаемся сделать так, чтобы shepherd s и sheep-sheering воспринимались как отдельные слова
У большинства реализаций имеются ограничения, связанные с вольностями
письменного языка Например, хотя второй шаблон успешно опознает слова
spank d и counter-clockwise , он выдернет rd из строки 23rd Psalom Чтобы
188 Глава б • Поиск по шаблону
повысить точность идентификации слов в строке, можно указать то, что окружает слово. Как правило, указываются метасимволы границ1, а не пропусков:
/\b([A-Za-z]+\b/ # Обычно наилучший вариант
/\s([A-Za-z]+)\s/ # Не работает в конце строки или без знаков препинания
В Perl существует метасимвол \w, который совпадает с одним символом, разрешенным в идентификаторах Perl. Однако идентификаторы Perl редко отвечают нашим представлениям о словах — обычно имеется в виду последовательность алфавитно-цифровых символов и подчеркиваний, но не двоеточий с апострофами. Поскольку метасимвол \Ь определяется через \w, он может преподнести сюрпризы при определении границ английских слов (и тем более — слов языка суахили).
