Оператор m// в общем виде записывается так:
$text =~ m/ регулярное выражение / модификаторы
или
$text !~ m/ регулярное выражение / модификаторы
Второй случай эквивалентен записи
not $text =~ m/ регулярное выражение / модификаторы
при которой возвращаемое значение логически инвертируется.
Целевым текстом по умолчанию является переменная $_. В этом случае ее и связку можно не писать.
$_ =~ m/ регулярное выражение / модификаторы
эквивалентно
m/ регулярное выражение / модификаторы
Если ограничителями являются слэши, то букву m также можно опустить.
Если регулярное выражение не задано, как в операторе
//
или задано в виде пустой или неопределенной переменной:
/$emtyvar/
то в таком операторе в качестве
Заскакивая вперед, еще скажу, что
my $re=qr/ регулярное выражение /; $text =~ $re;
или
$text =~ /$re/;
Оператор подстановки
$text =~ s/ регулярное выражение / выражение для подстановки / модификаторы
отличается от оператора поиска тем, что имеет заменяющую часть. Кроме того, в операторе подстановки может применяться e, влекущий вычисление выражения для подстановки как код e может быть использован многократно с многократной обработкой выражения для замены по правилам, аналогичным функции eval, перед тем, как произвести замену.
Всего в
i - игнорирует различие между заглавными и строчными буквами. На этот s - \n.m - разрешает привязку ^ и $ к промежуточным символам \n в тексте. В этом случае ^ совпадает не только в начале текста, как \A, но и после каждого символа \n, который не стоит в самом конце текста. А $ начинает совпадать не только в самом конце текста и перед \n, стоящим в самом конце текста, как \Z, но также после каждого символа \n, который не стоит в самом конце текста.x - игнорирует пробельные символы в g - поиск и замена выполняются глобально (в неявном цикле). Подробности мы рассмотрим.c - работает только с g и только с оператором m//, который применяется в скалярном контексте. Запрещает сбрасывать текущую позицию поиска, когда не удалось найти очередного совпадения. Подробности будут далее.o - o, чтобы избежать его многократной компиляции. Этот В языке m//. Например, если мы используем его в условии условного оператора:
if (m/…/) { … }
то это скалярный контекст, т.к. в условии ожидается одно значение, которое трактуется как истина или ложь. А если написать
my @m=m/…/;
то это списковый контекст, в котором оператор m// возвратит список значений. Оператор print является списковым, т.к. он ожидает список в качестве своего аргумента, поэтому, если написать
print m/…/;
то это также будет использование оператора поиска в списковом контексте.
В режиме однократного поиска (т.е. без g ) и в скалярном контексте оператор m// возвращает логическое значение: целое число 1, если поиск оказался успешным, или пустую строку в случае неудачи. Если в $1, $2, …, которые содержат соответствующие фрагменты захваченного текста. Если поиск оказался неудачным, то эти переменные хранят последнее состояние от предыдущего оператора поиска или замены.
После успешного поиска также можно использовать специальные переменые:
$ - копия текста, совпавшего со всем m/(…)/, то в случае успеха в переменной $1 получите то же самое значение.$` - копия текста, предшествующего началу совпадения (т.е. текст, который был слева от совпадения).$' - копия текста, следующего после совпадения (т.е. расположенного справа от совпавшего текста). После успешного совпадения текст "$`$$'" представляет из себя копию исходного текста. Есть малозначительное исключение: если оператор m// был успешно применен к неопределенной переменной, то эти специальные переменные будут иметь пустые значения.$+ - копия переменной $1 или $2… с максимальным номером, которой было присвоено значение. Если в $^N - копия переменной $1 или $2…, которая соответствует последней только что закрытой паре скобок на момент использования этой переменной. Если в @ - массив начальных смещений в целевом тексте. $-[0] хранит смещение начала совпадения от начала текста для всего $-[1] хранит смещение начала совпадения от начала текста для фрагмента текста, захваченного в переменную $1, $-[2] - для переменной $2 и т.д.@+ - аналогичный массив конечных смещений в целевом тексте. Т.е. смещений символов, следующих за конечными символами совпадения во всем тексте, в переменной $1, $2 и т.д. Имеет место соотношение substr($text,$-[0],$+[0]-$-[0]) эквивалентно $, substr($text,$-[1],$+[1]-$-[1]) эквивалентно $1 и т.д.Теперь буду давать пояснения к этому списку. Во-первых, имейте в виду, что переменная $0, похожая на нумерованную, не имеет отношения к
Начинающие часто путают специальные переменные $+ и $^N, между которыми имеется тонкое различие. Сначала рассмотрим пример использования переменной $+. Пусть в
$text =~ /(…)|(…)|(…)/;
Мы знаем, что совпадение может быть не более чем с одной альтернативой, и хотим получить фрагмент текста, совпавшего с какой-либо альтернативой. Не будь переменной $+, нам пришлось бы перебирать переменные $1, $2,… и определять, какая из них имеет определенное значение.
Для понимания отличия переменной $+ от $^N рассмотрим такой пример:
print "\$+=$+, \$^N=$^N" if "abc" =~ /(a(bc))/;
На печати окажется строка
$+=bc, $^N=abc
Различие происходит от того, что скобки могут быть вложенными. $2, а последними закрываются скобки у переменной $1.
Использовать значения переменных $+ и $^N можно также в коде
print "\$+=$+, \$^N=$^N"
if "abcd" =~ /(a(bc)(d)(?{ print "\$+=$+, \$^N=$^N\n" }))/;
Здесь выводятся значения переменных $+ и $^N после третьей скобки внутри
$+=d, $^N=d $+=d, $^N=abcd
$+ в обоих случаях относится к $3, а переменная $^N внутри $3, а вне $1.
Рассмотрим работу оператора m// в списковом контексте в режиме однократного поиска (т.е без g ). Возвращаемое значение зависит от того, есть ли в ($1, $2, $3, …).
Сами эти m// обычно применяется, когда надо извлечь из строки заранее известное число групп переменная=значение. Например:
my $url='var1=value1var2=value2'; my @pairs=$url =~ /(\w+)=(\w+)(\w+)=(\w+)/; print join ',',@pairs;
На печать выйдет строка
var1,value1,var2,value2
Если в 1.
В случае неудачного поиска в обоих случаях возвращается пустой список.
Вот пример идиомы для применения оператора m// в списковом контексте:
my $date='2007/3/12';
if (my($year,$month,$day)=$date =~ m!^(\d+)/(\d+)/(\d+)$!)
{ print "Year=$1, month=$2, day=$3";
} else
{ print 'Not found!';
}
На печать выведется
Year=2007, month=3, day=12
Мы присваиваем вовращаемое значение списку, поэтому применяется списковый контекст оператора поиска. Затем в операторе if этот список рассматривается в скалярном контексте, что дает число элементов этого списка. Полученный результат используется для проверки успешности выполнения оператора поиска.
Оператор поиска в скалярном контексте и с g ведет себя особым образом: переменная, к которой применяется поиск, будет неявно хранить позицию, на которой остановился последний поиск оператором m// в этой переменной. При очередном применении к этой переменной оператора поиска с g (в списковом или скалярном контексте) поиск продолжится не с начала текста, а с той позиции, на которой он остановился в последний раз. Это позволяет применить к одной и той же переменной несколько операторов поиска и извлекать из текста элементы один за другим. Эта позиция, на которой остановился оператор m//g в последний раз, может быть получена при обращении к функции pos с тем же аргументом, к которому применялся этот поиск.
Вот пример:
$_='1234567890'; /(\d)(\d)/g; print "$1,$2\n"; my @a=/(\d)(\d)/g; print join ',',@a;
На печать выйдут строки
1,2 3,4,5,6,7,8,9,0
Такая особенность сделана для возможности создания программ лексеров, которые разбирают текст на лексические единицы. Примеры мы увидим в следующих главах.
В случае применения оператора поиска к одной и той же константе:
while ('abcd'=~/(\w)/g) { print $1 }
она тоже будет хранить последнюю позицию поиска, иначе этот цикл продолжался бы вечно, каждый раз находя букву a. На печать выйдет строка
abcd
Если оператор поиска используется в глобальном поиске в списковом контексте и в
Пример:
my $text='123 234 345 456'; my @m=$text =~ /(\d+)(\s+)/g; print @m;
Будет напечатана строка
123 234 345 456
Если в
my $text='123 234 345 456'; my @m=$text =~ /\d+/g; print join ',',@m;
Будет напечатано
123,234,345,456
Оператор замены s/// без g ищет в заданной переменной прототип g замена производится столько раз, сколько раз был найден фрагмент текста, соответствующий
my $text='123 234 345 456'; $text =~ s/\d+/a/; print $text;
Получим строку
a 234 345 456
Еще пример:
my $text='123 234 345 456'; $text =~ s/\d+/reverse $/ge; print $text;
Здесь получим такой результат:
321 432 543 654
В последнем операторе поиска и замены мы использовали режим замены с e (с выполнением кода
$text =~ s/(\d+)/reverse $1/ge;
В операторах m// и s/// специальные переменные $1, $2, …, $, $`, $' и т.д. для каждой итерации, обусловленной g, создаются заново (локализуются). В результате при замене используются нужные значения этих переменных, которые возникли при последней итерации поиска.
m// и s/// обрабатываются особым образом. Вообще говоря, они "обрабатываются как строка в кавычках с учетом специфики регулярных выражений". Но если в операторе поиска/подстановки \r, \n, \t, все равно работают в
В части замены оператора s/// действует то же правило, за тем исключением, когда там стоит код e ). В строке, ограниченной апострофами, имеются только два \r, \n, \t, … не работают. В случае, если $ и @ являются $ используется как
Если скалярная переменная просто заменяется своим значением, то массив интерполируется всеми своими значениями или срезом своих элементов, который тоже может быть задан. Разделителем между элементами массива служит значение специальной переменной $", которая по умолчанию содержит пробел. Хеши в регулярное выражение не интерполируются, т.к. это не имеет смысла, поэтому символ % в
Замечу еще, что внутри классов переменные тоже интерполируются. Для закрепления этого материала рассмотрим такие примеры:
$_='abc'; my $s='c'; print '1' if /^ab$s$/;
Будет напечатана единица. После интерполяции
/^abс$/
Другой пример:
$_='abc'; my $s='ab'; print /[$s]/g;
Напечатается ab. Это
/[ab]/g
Класс совпал два раза и захватил на первой итерации букву a, а на второй - букву b.
В $$, $(, $), $|, чтобы не допускать конфликта с $. Не возникает коллизии, если в конце $ и за ним ограничитель / (или другой ограничитель). Ведь первым делом при обработке
После интерполяции переменных происходит обработка конструкций изменения регистра символов /L, /l, /U, /u, а также конструкций вставки литерального текста \Q…\E.
Полученный результат передается механизму
Оператор m// в общем виде записывается так:
$text =~ m/ регулярное выражение / модификаторы
или
$text !~ m/ регулярное выражение / модификаторы
Второй случай эквивалентен записи
not $text =~ m/ регулярное выражение / модификаторы
при которой возвращаемое значение логически инвертируется.
Целевым текстом по умолчанию является переменная $_. В этом случае ее и связку можно не писать.
$_ =~ m/ регулярное выражение / модификаторы
эквивалентно
m/ регулярное выражение / модификаторы
Если ограничителями являются слэши, то букву m также можно опустить.
Если регулярное выражение не задано, как в операторе
//
или задано в виде пустой или неопределенной переменной:
/$emtyvar/
то в таком операторе в качестве
Заскакивая вперед, еще скажу, что
my $re=qr/ регулярное выражение /; $text =~ $re;
или
$text =~ /$re/;
Оператор подстановки
$text =~ s/ регулярное выражение / выражение для подстановки / модификаторы
отличается от оператора поиска тем, что имеет заменяющую часть. Кроме того, в операторе подстановки может применяться e, влекущий вычисление выражения для подстановки как код e может быть использован многократно с многократной обработкой выражения для замены по правилам, аналогичным функции eval, перед тем, как произвести замену.
Всего в
i - игнорирует различие между заглавными и строчными буквами. На этот s - \n.m - разрешает привязку ^ и $ к промежуточным символам \n в тексте. В этом случае ^ совпадает не только в начале текста, как \A, но и после каждого символа \n, который не стоит в самом конце текста. А $ начинает совпадать не только в самом конце текста и перед \n, стоящим в самом конце текста, как \Z, но также после каждого символа \n, который не стоит в самом конце текста.x - игнорирует пробельные символы в g - поиск и замена выполняются глобально (в неявном цикле). Подробности мы рассмотрим.c - работает только с g и только с оператором m//, который применяется в скалярном контексте. Запрещает сбрасывать текущую позицию поиска, когда не удалось найти очередного совпадения. Подробности будут далее.o - o, чтобы избежать его многократной компиляции. Этот В языке m//. Например, если мы используем его в условии условного оператора:
if (m/…/) { … }
то это скалярный контекст, т.к. в условии ожидается одно значение, которое трактуется как истина или ложь. А если написать
my @m=m/…/;
то это списковый контекст, в котором оператор m// возвратит список значений. Оператор print является списковым, т.к. он ожидает список в качестве своего аргумента, поэтому, если написать
print m/…/;
то это также будет использование оператора поиска в списковом контексте.
В режиме однократного поиска (т.е. без g ) и в скалярном контексте оператор m// возвращает логическое значение: целое число 1, если поиск оказался успешным, или пустую строку в случае неудачи. Если в $1, $2, …, которые содержат соответствующие фрагменты захваченного текста. Если поиск оказался неудачным, то эти переменные хранят последнее состояние от предыдущего оператора поиска или замены.
После успешного поиска также можно использовать специальные переменые:
$ - копия текста, совпавшего со всем m/(…)/, то в случае успеха в переменной $1 получите то же самое значение.$` - копия текста, предшествующего началу совпадения (т.е. текст, который был слева от совпадения).$' - копия текста, следующего после совпадения (т.е. расположенного справа от совпавшего текста). После успешного совпадения текст "$`$$'" представляет из себя копию исходного текста. Есть малозначительное исключение: если оператор m// был успешно применен к неопределенной переменной, то эти специальные переменные будут иметь пустые значения.$+ - копия переменной $1 или $2… с максимальным номером, которой было присвоено значение. Если в $^N - копия переменной $1 или $2…, которая соответствует последней только что закрытой паре скобок на момент использования этой переменной. Если в @ - массив начальных смещений в целевом тексте. $-[0] хранит смещение начала совпадения от начала текста для всего $-[1] хранит смещение начала совпадения от начала текста для фрагмента текста, захваченного в переменную $1, $-[2] - для переменной $2 и т.д.@+ - аналогичный массив конечных смещений в целевом тексте. Т.е. смещений символов, следующих за конечными символами совпадения во всем тексте, в переменной $1, $2 и т.д. Имеет место соотношение substr($text,$-[0],$+[0]-$-[0]) эквивалентно $, substr($text,$-[1],$+[1]-$-[1]) эквивалентно $1 и т.д.Теперь буду давать пояснения к этому списку. Во-первых, имейте в виду, что переменная $0, похожая на нумерованную, не имеет отношения к
Начинающие часто путают специальные переменные $+ и $^N, между которыми имеется тонкое различие. Сначала рассмотрим пример использования переменной $+. Пусть в
$text =~ /(…)|(…)|(…)/;
Мы знаем, что совпадение может быть не более чем с одной альтернативой, и хотим получить фрагмент текста, совпавшего с какой-либо альтернативой. Не будь переменной $+, нам пришлось бы перебирать переменные $1, $2,… и определять, какая из них имеет определенное значение.
Для понимания отличия переменной $+ от $^N рассмотрим такой пример:
print "\$+=$+, \$^N=$^N" if "abc" =~ /(a(bc))/;
На печати окажется строка
$+=bc, $^N=abc
Различие происходит от того, что скобки могут быть вложенными. $2, а последними закрываются скобки у переменной $1.
Использовать значения переменных $+ и $^N можно также в коде
print "\$+=$+, \$^N=$^N"
if "abcd" =~ /(a(bc)(d)(?{ print "\$+=$+, \$^N=$^N\n" }))/;
Здесь выводятся значения переменных $+ и $^N после третьей скобки внутри
$+=d, $^N=d $+=d, $^N=abcd
$+ в обоих случаях относится к $3, а переменная $^N внутри $3, а вне $1.
Рассмотрим работу оператора m// в списковом контексте в режиме однократного поиска (т.е без g ). Возвращаемое значение зависит от того, есть ли в ($1, $2, $3, …).
Сами эти m// обычно применяется, когда надо извлечь из строки заранее известное число групп переменная=значение. Например:
my $url='var1=value1var2=value2'; my @pairs=$url =~ /(\w+)=(\w+)(\w+)=(\w+)/; print join ',',@pairs;
На печать выйдет строка
var1,value1,var2,value2
Если в 1.
В случае неудачного поиска в обоих случаях возвращается пустой список.
Вот пример идиомы для применения оператора m// в списковом контексте:
my $date='2007/3/12';
if (my($year,$month,$day)=$date =~ m!^(\d+)/(\d+)/(\d+)$!)
{ print "Year=$1, month=$2, day=$3";
} else
{ print 'Not found!';
}
На печать выведется
Year=2007, month=3, day=12
Мы присваиваем вовращаемое значение списку, поэтому применяется списковый контекст оператора поиска. Затем в операторе if этот список рассматривается в скалярном контексте, что дает число элементов этого списка. Полученный результат используется для проверки успешности выполнения оператора поиска.
Оператор поиска в скалярном контексте и с g ведет себя особым образом: переменная, к которой применяется поиск, будет неявно хранить позицию, на которой остановился последний поиск оператором m// в этой переменной. При очередном применении к этой переменной оператора поиска с g (в списковом или скалярном контексте) поиск продолжится не с начала текста, а с той позиции, на которой он остановился в последний раз. Это позволяет применить к одной и той же переменной несколько операторов поиска и извлекать из текста элементы один за другим. Эта позиция, на которой остановился оператор m//g в последний раз, может быть получена при обращении к функции pos с тем же аргументом, к которому применялся этот поиск.
Вот пример:
$_='1234567890'; /(\d)(\d)/g; print "$1,$2\n"; my @a=/(\d)(\d)/g; print join ',',@a;
На печать выйдут строки
1,2 3,4,5,6,7,8,9,0
Такая особенность сделана для возможности создания программ лексеров, которые разбирают текст на лексические единицы. Примеры мы увидим в следующих главах.
В случае применения оператора поиска к одной и той же константе:
while ('abcd'=~/(\w)/g) { print $1 }
она тоже будет хранить последнюю позицию поиска, иначе этот цикл продолжался бы вечно, каждый раз находя букву a. На печать выйдет строка
abcd
Если оператор поиска используется в глобальном поиске в списковом контексте и в
Пример:
my $text='123 234 345 456'; my @m=$text =~ /(\d+)(\s+)/g; print @m;
Будет напечатана строка
123 234 345 456
Если в
my $text='123 234 345 456'; my @m=$text =~ /\d+/g; print join ',',@m;
Будет напечатано
123,234,345,456
Оператор замены s/// без g ищет в заданной переменной прототип g замена производится столько раз, сколько раз был найден фрагмент текста, соответствующий
my $text='123 234 345 456'; $text =~ s/\d+/a/; print $text;
Получим строку
a 234 345 456
Еще пример:
my $text='123 234 345 456'; $text =~ s/\d+/reverse $/ge; print $text;
Здесь получим такой результат:
321 432 543 654
В последнем операторе поиска и замены мы использовали режим замены с e (с выполнением кода
$text =~ s/(\d+)/reverse $1/ge;
В операторах m// и s/// специальные переменные $1, $2, …, $, $`, $' и т.д. для каждой итерации, обусловленной g, создаются заново (локализуются). В результате при замене используются нужные значения этих переменных, которые возникли при последней итерации поиска.
m// и s/// обрабатываются особым образом. Вообще говоря, они "обрабатываются как строка в кавычках с учетом специфики регулярных выражений". Но если в операторе поиска/подстановки \r, \n, \t, все равно работают в
В части замены оператора s/// действует то же правило, за тем исключением, когда там стоит код e ). В строке, ограниченной апострофами, имеются только два \r, \n, \t, … не работают. В случае, если $ и @ являются $ используется как
Если скалярная переменная просто заменяется своим значением, то массив интерполируется всеми своими значениями или срезом своих элементов, который тоже может быть задан. Разделителем между элементами массива служит значение специальной переменной $", которая по умолчанию содержит пробел. Хеши в регулярное выражение не интерполируются, т.к. это не имеет смысла, поэтому символ % в
Замечу еще, что внутри классов переменные тоже интерполируются. Для закрепления этого материала рассмотрим такие примеры:
$_='abc'; my $s='c'; print '1' if /^ab$s$/;
Будет напечатана единица. После интерполяции
/^abс$/
Другой пример:
$_='abc'; my $s='ab'; print /[$s]/g;
Напечатается ab. Это
/[ab]/g
Класс совпал два раза и захватил на первой итерации букву a, а на второй - букву b.
В $$, $(, $), $|, чтобы не допускать конфликта с $. Не возникает коллизии, если в конце $ и за ним ограничитель / (или другой ограничитель). Ведь первым делом при обработке
После интерполяции переменных происходит обработка конструкций изменения регистра символов /L, /l, /U, /u, а также конструкций вставки литерального текста \Q…\E.
Полученный результат передается механизму
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.