Анимация
JavaScript
|
Главная Библионтека Использование другого разделителя Чтобы найти строку, которая содержит несколько косых (/), в соответствующем регулярном выражении нужно перед каждой из них поставить обратную косую черту (\). Например, чтобы найти строку, которая начинается с названия директории /usr/etc, нужно записать: 5path = <STDIN>; # прочитать путевое имя (вероятно, из find?) if (5path =~ /"\/usr\/etc/) { # начинается с /usr/etc... Как видите, комбинация "обратная косая - косая" создает между элементами текста своеобразные "проходы". Если косых очень много, это занятие может стать весьма утомительным, поэтому в Perl предусмотрена возможность использования другого разделителя (delimiter). Поставьте перед любым специальным символом* (выбранным вами в качестве разделителя) букву т, укажите свой образец и дайте еще один такой же разделитель: /\/usr\/etc/ # использование стандартного разделителя - косой черты m(?/usr/etc(? # использование в качестве разделителя символа (? m#/usr/etc# # использование в качестве разделителя символа # # (это мой любимый символ) Если хотите, можете опять использовать косые, например, m/fred/. Таким образом, m - общепринятое обозначение операции сопоставления с регулярным выражением, но если в качестве разделителя выбрана косая черта, то m не обязательна. Использование интерполяции переменных Перед тем как регулярное выражение рассматривается на предмет наличия специальных символов, в нем производится интерполяция переменных. Следовательно, регулярное выражение можно строить не только из литералов, но и из вычисляемых строк. Например: $what = "bird"; 5sentence = "Every good bird does fly."; if (Ssentence =~ /\b$what\b/) { print "The sentence contains the word $what\n"; Здесь мы использовали ссылку на переменную для построения операции сопоставления с регулярным выражением \bbird\b/. Если этот разделитель - левый элемент пары (круглая, фигурная, угловая или квадратная скобка), то закрывающим разделителем будет соответствующий правый элемент пары В остальных случаях первый и второй разделители будут совпадать. Вот несколько более сложный пример: $sentence = "Every good bird does fly."; print "What should I look for? "; $what = <STDIN>; chomp($what) ; if ($sentence =~ /$what/) { # нашли print "I saw Swhat in Ssentence.\n"; ) else { print "nope... didnt find it.\n"; Если вы введете слово bird, оно будет найдено, а если слово scream - не будет. Если ввести [bw] ird, результаты поиска тоже будут успешными. Это говорит о том, что квадратные скобки в данном случае воспринимаются как символы сопоставления с образцом. Чтобы избежать этого, следует поставить перед этими символами обратную косую, которая превратит их в символы буквального сопоставления. Это кажется сложным, если в вашем распоряжении нет закавычивающей управляющей последовательности \q: $what = " [box]"; foreach (qw(in([box] out[box] white[sox])) ( if (/\Q$what\E/) ( print "$ matched\n"; Здесь конструкция \Q$what\E превращается в \[box\], в результате чего операция сопоставления ищет пару квадратных скобок, а не рассматривает всю конструкцию как класс символов. Специальные переменные, защищенные от записи После успешного сопоставления с образцом переменным $1, $2, $3 и т.д. присваиваются те же значения, что и\1, \2, \3 и т.д. Это можно использовать для поиска соответствия в последующем коде. Например: S = "this IS а test"; / (\w+)\W+(\w+)/; # сопоставление первых двух слов # SI теперь содержит this, а S2 - is Доступ к тем же значениям ($1, $2, $3 и т.д.) можно также получить, использовав операцию сопоставления для соответствующих списков. Если результаты сопоставления окажутся положительными, будет получен список значений от $1 до $п (где п - количество занесенных в память элементов). В противном случае значения не определены. Запишем последний пример по-другому: S = "this IS а test"; (Sfirst, Ssecond) = /(\w+)\W+(\w+)/; # сопоставление первых двух слов # Sfirst теперь содержит this, а Ssecond - is к другим предопределенным защищенным от записи переменным относятся: $& (часть строки, совпавшая с регулярным выражением); $~ (часть строки, стоящая перед совпавшей частью); $ (часть строки, стоящая после совпавшей части). Например: $ = "this is а sample string"; /sa.*le/; # соответствует слову sample внутри строки # 5" теперь содержит "this is а " # $& теперь содержит "sample" # 5 теперь содержит "string" Поскольку значения этим переменным присваиваются при каждом успешном сопоставлении, их нужно где-нибудь сохранить, если они вам впоследствии понадобятся*. Операция замены Мы уже говорили о простейшей форме операции замены: з/ регуляр-ное выражение/новая строка/. Пора рассмотреть несколько разновидностей этой операции. Если вы хотите, чтобы замена выполнялась при всех возможных совпадениях, а не только при первом, добавьте в запись, задающую проведение операции замены, букву д, например: $ = "foot fool buffoon"; s/foo/bar/g; # $ теперь содержит "bart barl bufbarn" В заменяющей строке производится интерполяция переменных, что позволяет задавать эту строку во время выполнения: $ = "hello, world"; 5new = "goodbye"; s/hello/5new/; # заменяет hello на goodbye Символы сопоставления (метасимволы) в регулярном выражении позволяют выполнять сопоставление с образцом, а не просто с символами, трактуемыми буквально: $ = "this is а test"; s/(\w+})/<51>/д; # 5 теперь содержит "<this> <is> <a> <test>" Вспомните, что в $l заносятся данные, полученные при совпадении с первой заключенной в круглые скобки частью образца. Суффикс i (перед буквой g или после нее, если она есть) заставляет используемое в операции замены регулярное выражение игнорировать регистр, как и аналогичная опция в ранее рассмотренной нами операции сопоставления. о влиянии этих переменных на производительность рассказывается в книге Mastering Regular Expressions (издательство OReilly). 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 |