Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [ 28 ] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Ниже приведено несколько примеров:

Ad{5}/; » Пять щфр подряд /\s\w+\s/j \ Группа символов слов, окружеппых * символами пробела

Но будьте внимательны! Последний шаблон не всегда соответствует слову, например символ подчеркивания, окруженный пробелами, также будет считаться словом. Кроме того, с помощью последнего шаблона будут найдены не все слова, а только те, которые окружены пробелами. При этом слова типа dont не будут найдены из-за апострофа. Ниже вам будет предложен гораздо лучший шаблон для поиска слов.

Группировка и альтернация

В регулярных выражениях можно объединять несколько шаблонов, так чтобы найденная строка соответствовала хотя бы одному из них. Это полезно, если, к примеру, необходимо проверить строку на наличие в ней слов dogs или cats. Для решения подобной проблемы служит операция альтернации, которая в регулярных выражениях задается символом , например:

if(/ciogscats/) {

print "В строке \$ говорится о домашних жявотныхХп";

. Альтернация - полезная вешь, но не всегда удобная, если нужно найти большое количество похожих слов. Пусть вам нужно найти одно из слов frog, bog, log, flog или clog, а выражение /frogboglogflogclog/ кажется вам слишком громоздким. Тогда нужно воспользоваться альтернацией только для начала строки. Вы можете попытаться использовать такой шаблон:

Ничего не выйдет!

С помощью данного шаблона не удастся добиться требуемого эффекта, потому что Perl не знает, что альтернация касается начальной части строки. Для решения этой

проблемы необходимо воспользоваться группировкой регулярных выражений Perl с

помощью символов скобок {).

/(frtlflcl)og/;

Допускается вложение скобок, а следовательно, и вложение групп. Предыдущий пример можно переписать и так: /(frbl (с)1)од/.

В контексте списка оператор поиска по шаблону возвращает список частей найденного выражения, соответствующих группам шаблона. Каждая группа возвращает соответствующее ей значение в список, а если групп в шаблоне нет - возвращается просто 1. Вот пример:

$ ="арр1е is red";

(Sfruit, $color)=/(.*)\si8\s(.*)/;

В данном случае шаблон соответствует произвольной последовательности символов

(она задана в виде первой группы), за которой расположен пробел, слово is, еще один

пробел, а затем другая произвольная последовательность символов (она задана в виде второй группы). Значения частей строки поиска, соответствующие группам регулярного выражения, присваиваются элементам списка $fruitn Scolor, расположенного в

левой части оператора присваивания.



Анкеры

Последние два метасимвола (могу поспорить, вы уже думаете: "Когд же они наконец закончатся?!") - это анкеры. С их помощью можно указать, в каком месте строки (в начале или в конце) должно быть найдено соответствие с шаблоном.

Первый из этих анкеров - символ вставки ("). Этот символ; помешенный в начале регулярного выражения, говорит о том, что соответствие шаблону должно быть найдено в начале строки. Например, /"video/ соответствует слову video, но только если оно находится в начале строки.

Его двойник - символ доллара ($). Этот символ, помещенный в конец регулярного выражения, говорит о том, что соответствие шаблону должно быть найдено в конце строки. Например, /earth$/ соответствует слову earth, но только если оно находится в конце строки. Ниже приведено несколько примеров (табл. 6.4).

Таблица 6.4. Пример использования анкеров

Шаблон

Описание

/"Help/ Находит строки, начинающиеся с Help

/"Frankly. *darn$/ Находит строки, начинающиеся со . слова Frankly и заканчивающиеся словом darn. Между этими словами может быть все, что угодно

/"hysterias/ Находит строки, состоящие только из слова hysteria

/"$/ Находит пустые строки

Находит начало любой строки. Шаблон /$/ имеет похожее действие

Подстановка

Поиск по определенному шаблону во введенных строках - это только полдела. Часто требуется модифицировать найденные данные. Для этого можно воспользоваться оператором подстановки е /,хотя это далеко не единственный способ. Синтаксис этого оператора выглядит так:

в/ й9бпов поиска1строка замены1;

. По умолчанию оператор подстановки ишет. строку,.. соответствующую шаблону в неременной 5 , и заменяет ее на строку занеиа. Оператор подстановки возвращает количество выполненных замен или 0, если ни одной замены не бгло сделано. Вот пример:

$ ="Our house is in tiie middle of our street"; s/middle/end/; J Сейчас: Our house is in the end of our street s/in/at/; f Сейчас: Our house is at the end of our street

if (s/apartment/ccndo/) {

Этот код не будет выполняться, см. примечание.

В этом примере подстановки произошли, как вы и ожидали. Слово было

изменено на end, a in - на at. Блок кода оператора if не выполняется, так как в переменной $ отсутствует слово ment, поэтому подстановка невозможна.

Часть I. ОcноEl Perl



В операторе подстановки кроме обратной косой черты можно использовать и другие символы-ограничители. Для этого просто поместите требуемый символ-ограничитель сразу же после префикса s, как показано ниже:

sfBtreetlavenue*;

Упражнение: очистка входнтх данных

Подстановка данных вслепую, без проверки правильности выполнения команды (как в примере из предтдущего раздела), - обычная практика при обработке массивов данных. При этом программа считывает исходные данные с клавиатуры или файла и форматирует их в надлежащем виде для последующей обработки. В листинге 6.1 приведен простой пример программы демонстрации обработки данных, которая вычисляет массу тела на Луне по его Земной массе.

Наберите в текстовом редакторе программу из листинг,! и сохраните ее под именем Moon. Сделайте файл программы выполняемым с помощью инструкций, приведенных на 1-м занятии, "Начало работы с Perl".

Пример выходных данных этой программы приведен в листинге 6.2.

сп 6.1. огрма выле масс! пела на Луне

3: print "Введите массу тепа:"; 4: $ =<STDIH>; chomp;

5: s/s+Z/; t ЗлжтБробегы в штате сгрска б:

7: if (т/(1Ьв?кг?1снлогра11М?фунт?)/1) { 8: if (в/\8*(1Ь8?фунт?),* 1) {

9: S .=0.4536;

10: } else-"{

11: в/\в*{1сг?1кипогра1ш?).* ;

12: }

13:}

14:print "Масса тепа на Луне: , $ *. 16667, " кг\п-;

1сп 6.2. /ер выпа ограммы! Mbcn

1: $ perl Mm

2: Введите массу тела;4 кг

3: Масса тела на Пуне: 0.66668 кг 4 : $ perl Mm

5: Введите массу тела:6 фунт

6: Масса тепа на Пуне: 0.453609072 кг

Проведем анализ программы.

• Строка 1. В этой строке находится путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим выдачи предупреждений!



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [ 28 ] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122