Анимация
JavaScript
|
Главная Библионтека Здесь каждый элемент массива поочередно присваивается переменной $ , затем в этой переменной производится поиск по шаблону /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 |