Анимация
JavaScript
|
Главная Библионтека • Строки 3-4. Здесь пользователь вводит свой вес, и функция cho удаляет символ новой строки из неременной .5 - Напоминаем, что если не указана другая переменная, то по умолчанию функция chomp использует $ . • Строка 5. Шаблон s+/ находит символы пробелов в начале введенной строки. Поскольку строка замены отсутствует, то найденные пробелы просто удаляются. • Строка 7. Проверяется наличие во введенной строке допустимой единицы измерения. • Строки 8-9. Шаблон s/\s*(lbsT?) находит во входной строке слова lbs или фунт с возможными символами пробела перед ними (при этом учитгвается падеж или множественное число). Например, слова фунт (как с пробелом впереди, так и без) или lbs будут удалены из входной строки. При этом значение переменной $ умножается на для перевода фунтов в килограммы. • Строке!. В противном случае из переменной $ удаляются слова кг или килограмм, а также окружающие их пробелы. • Строка 14. Уже переведенная в килограммы масса тела, находящаяся в переменной $ , умножается на 1/6 и выводится на печать. Дополнительная информация о регулярных выражениях Выше мы рассмотрели основные способы обработки текста, находящегося в переменной $ с помощью оператора подстановки. Теперь вас ждет новая порция информации по функциональным возможностям регулярн1х выражений. Эффективное использование регулярных выражений предполагает возможность работы не только с $ , но и с другими переменными, использование сложных подстановок, а также применение функций Perl, имеющих отношение к регулярным выражениям. Работа с .другими переменными В предыдущей программе введенная пользователем масса хранилась в переменной $ , поэтому все поиски по шаблону и подстановки выполнялись с этой переменной. Переменная $ - не самое удобное место для хранения массы тела. Во-первых, это не очень понятно для начинающих программистов, а во-вторых значение переменной $ может быть неожиданно изменено в другом месте программы. Вообще длительное хранение чего либо в $ - это игра с огнем, поскольку многие из операторов Perl по умолчанию используют эту переменную и модифицируют ее. В Perl $ считается переменной общего пользования и длительное хранение в ней каких-либо данных, как правило, приводит к ошибкам. Изучив материал 8-го занятия, "Функции", вы сами в этом убедитесь. В программе, приведенной в листинге 6.1, лучше ввести новую переменную $weight. Для выполнения с ней операций поиска и замены необходимо "привязать" эту переменную к соответствующим операторам. Для этого используется оператор привязки =": $veight="185 lbs"; $weight="/ lbs ; } ГОусаысвжа Еыгжкеяся в -педяЕСЙ Sweight 1 I. Оператор не производит никакого присваивания, он просто определяет, что оператор справа действует на переменную слева. Значение всего выражения такое же, как и при использовании переменной $ , как можно видеть из примера: $poem="One fish, two fish, red fish"; $n=$poein="ni/fish/; ♦ $n имеет истинное значевве, i если в Spoen есть слово fish Модификаторы и многократный поиск До сих пор наши регулярные выражения были чувствительны к регистру. Это значит, что символы верхнего и нижнего регистров воспринимались ими как разные. Для поиска слов без учета регистра букв можно использовать шаблоны, подобные этим: /[№][Aa][Cc][Bb][Ee]tTt][Hh]/; . Как видите, это довольно громоздкий способ, часто приводящий к ошибкам из-за неправильного набора пар букв. Существует гораздо лучший способ. В операторах подстановки (s /) или поиска по шаблону (га ) предусмотрен режим, в котором не учитывается регистр букв в искомых словах. Для этого после шаблона нужно поместить суффикс i, например: /nacbeth/i; Этот оператор найдет слово Macbeth в прописном, строчном :Или каком-нибудь ином смешанном варианте (Ла СЬКЯ). Кроме суффикса i, в операторах поиска и подстановки можно использовать модификатор д, который задает режим глобального поиска. Поиск (или подстановка) при этом будут выполняться многократно по всей строке: сначала находится первое слева совпадение и выполняется первая подстановка, а затем поиск и замена продолжаются до конца строки. В контексте списка оператор поиска с модификатором g возвращает список, элементы которого соответствуют группам регулярного выражения, например: $ ="Опе fish, two frog, red fred, blue foul"; «F=iii/\W(f\w\w\w)/g; Шаблон состоит из символа-разделителя (любого не текстового символа), буквы f и трех любых текстов1х символов. Буква f и три символа объединены в группу с помощью скобок. После вычисления выражения в массиве будет содержаться четыре элемента: fish, frog, fred и foul. В скалярном контексте оператор поиска с модификатором д проходит всю строку и при каждом совпадении возвращает истинное значение. Если больше совпадений не найдено, то возвращается ложное значение. Вот пример: $letters=0; Sphrase="Hliats пу line?"; le{$phrase=~/\wj/g> { $letters++; Здесь оператор поиска ( ) с модификатором g находится в скалярном контексте, поскольку он используется в условном выражении while. Шаблон предназначен для поиска текстового символа. Цикл while продолжается (и переменная $letter увеличивается) до тех пор, пока оператор поиска не возвращает ложное значение. После окончания цикла переменная $letters будет иметь значение 11. Значительно более эффективный метод подсчета символов будет рассмотрен на 9-м занятии, "Дополнительные функции и операторы". Обратные ссылки ЕСЛИ В регулярнгх выражениям Perl используются скобки, части искомой строки, соответствующие фрагментам в скобках, запоминаются в специальных переменных $1 (первый фрагмент в скобках), $2 (второй), $3, $4 и т.д. Вот пример: /j\d{3})-t\d{3})-(\d{4})/ $1 Nb$2 4S3 Этот шаблон служит для поиска правильно отформатированных телефонных номеров, принятых в США и Канаде, например таких ка 5-1212. Каждая порция номера запоминается в специальных переменных $12 $3. Эти переменные могут быть использованы в программе, например: if (/(\d{3>)-(\d{3>)-(\d{4>)/) { print *Код региона - $1"; Кроме программы, специальные переменные $2 и т.д. могут использоваться в строке замены оператора подстановки, например: s/(\d{3})-(\d{3})-(\d{4})/Kofl региона $1, телефон $2-$3/; Но будьте внимательны, эти переменные модифицируются при каждом успешном поиске, независимо от использования в регулярном выражении скобок. Кроме того, значения этих переменных устанавливаются тогда и только тогда, когда строка полностью соответствует шаблону. Приняв это во внимание, посмотрите на пример: m/(\d{3))-\d{3})-(\d{4))/; pdnt "Yen РЭЕЮЕ - $1" ; ♦ ItoCM стиль, пхжшщ/ не пр«иуве1ся ю эиунние $ ероЕность оаго поиска В этом примере переменная $1 используется без проверки успешности поиска по шаблону. В случае неудачного поиска это может привести к ошибке в программе. Новая функция:grep Поиск в массиве по шаблону - одна из наиболее распространенных операций Perl. Например, вы считываете весь файл в массив и хотите зпать, в каких строках файла встречается определенное слово. Как раз для подобных ситуаций в Perl имеется функция grep. Вот ее синтаксис: grep выражение, список grep блок список Функции ер проходит каждый элемент списка и выполняет для него указанное выражение ил ох. Внутри выражения или блока в качестве очередного элемента списка выступает переменная $ . Если выражение истинно, данный элемент возвращается функцией Ниже приведен пример: §dogs=qw( greyhound blcxDdhDund terrier mutt chihuahua) ; ghounds=grep-/hound/, в dogs; 106 Ча [. ОcнGEl Perl 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 |