Анимация
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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

6.1. Копирование с подстановкой 185

ходят специальные модули. Скажем, регулярные выражения не обладают средствами для работы со сбалансированным вводом, то есть любыми данными произвольной вложенности - например, парными скобками, тегами HTML и т. д. Для таких целей приходится строить настоящий анализатор наподобие HTML::Parser из рецептов главы 20 «Автоматизация в Web». Еще одна задача, не решаемая шаблонами Perl, - неформальный поиск. В рецепте 6.13 показано, как она решается с помощью специального модуля.

6.1. Копирование с подстановкой

Проблема

Вам надоело многократно использовать две разные команды для копирования и подстановки.

Решение

Замените фрагменты вида;

Sdst = $src,

$dst =~ s/this/that/,

следующей командой;

($dst = $src) =~ s/this/that/,

Комментарий

Иногда подстановка должна выполняться не в исходной строке, а в ее копии, однако вам не хочется делить ее на два этапа. Например;

й Выделить базовое имя (Sprogname = $0) =" si" ./ .

tt Начинать Все Слова С Прописной Буквы (Scapword = Sword) =~ s/(\w+)/\u\L$Vg,

# /usr/man/man3/foo .1 заменяется на /usr/man/man/cat3/foo 1 (Scatpage - Smanpage) =~ s/man(=\d)/cat/,

Подобная методика работает даже с массивами;

(Sbindirs = qw( /usr/bin /bin /usr/local/Ып ), for ((Slibdirs = (Sbindirs) { s/bin/lib/ } print @libdirs\n , /usr/lib /lib /usr/local/lib

Если подстановка должна выполняться для правой переменной, а в левую заносится результат, следует изменить расположение скобок. Обычно результат подстановки равен либо "" в случае неудачи, либо количеству выполненных замен. Сравните с предыдущими примерами, где в скобки заключалась сама операция присваивания. Например:



($а = $Ь) =" s/x/y/g # Скопировать $Ь и затем изменить $а $а = ($Ь =" s/x/y/g) # Изменить $Ь и занести в $ количество подстановок

1> Смотри также-

Раздел «Assignment Operators» рег/ор(1)

6.2. Идентификация алфавитных символов

Проблема

Требуется узнать, состоит ли строка только из алфавитных символов

Решение

Наиболее очевидное решение не подходит для общего случая

If ($var - /"[A-Za-z]+$/) { # Только алфавитные символы

Дело в том, что такой вариант не учитывает локальный контекст пользователя Если наряду с обычными должны идентифицироваться символы с диакритическими знаками, воспользуйтесь директивой use locale и инвертированным символьным классом

use locale

If ($var /~["\W\d ]+$/) {

print var is purely alphabetic\n

Комментарий

в Perl нонятие «алфавитный символ» тесно связано с локальным контекстом, поэтому нам придется немного схитрить Регулярное выражение \w совпадает с одним алфавитным или цифровым символом, а также символом подчеркивания Следовательно, \W не является одним из этих символов Инвертируемый символьный класс ["\W\d ] определяет байт, который не является алфавитным символом, цифрой или подчеркиванием После инвертирования остаются одни алфавитные символы которые нас и интересуют В программе это выглядит так

use locale

use POSIX locale h

# Ha вашем компьютере строка локального контекста может выглядеть иначе unless (setlocale(LC ALL fr CA IS08859-1 )) { die couldn t set locale to French Canadian\n

while (<DATA>) {



6 3 Поиск слов 187

chomp

If (/"["\W\d ]+$/) }

print $ alphabetic\n

} else [

print $ line noise\n

END silly fasade couperate nico йепие МоИиге Ьжтод1оЬ1п nanve tschbfl

randomstuff#here

I> Смотри также-

Описание работы с локальным контекстом вperllocale(l), страница руководства locale{3) вашей системы, рецепт 6 12

6.3. Поиск слов

Проблема

Требуется выделить из строки отдельные слова

Решение

Хорошенько подумайте, что должно считаться словом и как одно слово отделяется от остальных Затем напишите регулярное выражение, в котором будут воплощены ваши решения Например

/\8+/ # Максимальная серия байтов не являющихся пропусками

/[A-Za 2 -]+/ # Максимальная серия букв апострофов и дефисов

Комментарий

Концепция «слова» зависит от приложения, языка и входного потока, поэтому в Perl не существует встроенного определения слов Слова приходится собирать вручную из символьных классов и квантификаторов, как это сделано выше Во втором примере мы пытаемся сделать так, чтобы shepherds и sheep-sheering воспринимались как отдельные слова

У большинства реализаций имеются ограничения, связанные с вольностями письменного языка Например, хотя второй шаблон успешно опознает слова spank d и counter-clockwise , он выдернет rd из строки 23rd Psalom Чтобы



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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242