Анимация
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

Здесь каждый элемент массива поочередно присваивается переменной $ , затем в этой переменной производится поиск по шаблону /hound/. Каждый из элементов, для которого это выражение истинно, возвращается функцией grep и помещается в массив

Существует два важных момента. Первый заключается в том, что переменная ссьшается на реальный элемент списка и модификация $ изменяет значение этого элемента, например:

ehounds=grep s/hound/hounds/, §dogs;

После выполнения этого кода массив unds будет содержать элементы greyhounds и bloodhounds (обратите внимание на 5 в конце этих слов). Исходный массив dogs

также изменяется из-за изменения значения переменной $ . Теперь в нем будут содержаться элементы g-eyюuлds, bloodhounds, terrier, mutt ш chihuahua.

Другой важный момент, о котором программисты часто забывают, состоит в том, что в функции grep необязательно должен использоваться оператор поиска или подстановки. Вместо него может быть использован любой оператор. В следующем примере выбираются породы собак, в названии которых содержится более восьми букв:

§longdogE=grep length{$ )>8, Bdogs;


Функция grep получила свое имя от команды UNIX, используемой для поиска по шаблону в файлах. Это настолько полезная команда, что ее название стало именем нарицательным в мире UNIX. Для представителей этого мира выражение "grep-нь книгу" - означает пролистать книгу в поисках нужного материала.

Родственная grep функция имеет аналогичный синтаксис. Отличие между ними состоит в том, что возвращает значение блока или выражения, а не значение неременной $ . С помощью функции тар из одного массива можно легко образовать

другой, например:

§words=map {split $ } Sinput;

В этом примере каждый элемент массива передаваемый в блок как $ , разбивается но словам функцией split. В качестве символа-разделителя используется пробел. Это означает, что каждый элемент массива input преобразуется в список слов, которые помещаются в массив Swords.

Резюме

На этом занятии вы узнали, что такое регулярные выражения, как их составлять и для чего они используются в Perl. Регулярные выражения состоят из обычных символов и метасимволов. Обычные символы, как правило, соответствуют самим себе, а метасимволы изменяют значения обычных символов друг друга). Регулярные выражения используются для поиска строк по шаблону и для подстановок.

Вопросы и ответы

Почему с помощью шаблона можно найти не все слова в строке, а только

те, которые находятся в середине строки?

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



Какая разница межд ш и ? Я не нахожу никакой.

Действительно, между ними нет почти никакой разницы. Буква m нужна лишь при использовании символов-разделителей шаблона, отличных от /, как, например, в т\ша6лон1.

ряю, правильно ли пользователь вводит число, а шаблон /\d*/ не работает. У него всегда истинное значение!

Поиск по данному шаблону с квантификатором * всегда успешен, неважно, найдены 2 цифры, 100, 1000 или вообще ни одной. Чтобы гарантировать наличие хотя бы

одной цифры, нужно использовать шаблон /\d+/.

Семинар

Если вы хоть как-то разобрались в этих регулярных выражениях и шаблонах, проверьте свои знания при помощи простых

Контрольные вопросы

1. ЕСЛИ строки имеют формат х=у, какое выражение поменяет местами левые

и правые части равенств?

а) s/{. + )=(.+)/$2=$l/;

б) s/(*)=(*)/S2=$l/;

в) s/{.*)=(.*)/52Sl/;

2. Какое значение примет переменная $2 после выполнения этого кода?

Sfoo="Star Vfers: The Itentan Menace"; $foo="/star\s((Wars}: The Ehanton Ifenace)/;

$2 не установлена, так как поиск завершился неудачей;

б) Wars;

в) Wars: The Phantom Menace.

3. Чему соответствует шаблон + "

а) датам, представленным в формате

б) числам, таким как 45, 15.3 или -0.61;

в) суммам: 4+12 или 89+2.

Ответы

1. Правильный ответ - вариант а). Вариант в) не содержит символа равенства в строке замены. Вариант б) совершенно неправильный - перед * должен

быть какой-то символ. Вариант а) полностью подходит.

2. Правильным ответом является вариант а). Поиск не удался, потому что слово star написано строчными буквами, а оператор поиска не содержит модификатора Именно поэтому нужно всегда проверять, удался ли поиск, перед использованием переменных $1, $2 и остальных, подобных им. Если

108 , Часть I. ОcнGEl Perl



бы в операторе присутствовал модификатор i или слово star было написано

с прописной буквы, правильным был бы ответ б).

3. Правильный ответ - вариант б). Шаблон ищет в начале строки необязательные символы + или - затем одну или несколько цифр, необязательную десятичную точку, еще цифры и следуемый за ними конец строки. Это соответствует правильно отформатированным числам.

Упражнения

• Постарайтесь составить шаблон, соответствующий стандартному формату времени. Под этот шаблон должны подходить, например, такие строки: 12:00am, 5; 00pm, ЗОШ. А эти строки не должны воснриниматься щаблоном - 3:00, 2:60am, 99:00am, 3:0pm.

• Напишите короткую программу, которая делает следующее.

1. Открывает файл.

2. Считывает все его строки в массив.

3. Извлекает все слова из каждой строки.

4. Находит все слова с четырьмя и большим количеством смежных согласных букв, например слова thoughts или yardstick.



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