Николай Матковский,

Регулярные выражения в Perl

Регулярные выражения используются для нахождения шаблонов в строках. Например, для того, чтобы найти в телефонной книге конкретное имя, или,например, все имена, начинающиеся с буквы 'a'. Работа с регулярными выражениями является одной из самых мощных и полезных, и в тоже время самых сложных для понимания особенностей Perl. Надеемся, что после прочтения этой статьи вы поймете, насколько это мощный и удобный инструмент. Получив некоторый опыт вы сможете использовать эти возможности с большой пользой для себя.
Операторы

Для работы с регулярными выражениями в Perl используются три оператора
- оператор сравнения (matching - m//), оператор подстановки
(substitution s///) и оператор перевода (translation - tr///).

Все три оператора используют переменную $_ по умолчанию, поэтому
дальше, пока не будут представлены операции =~ и !~, будем
пользоваться ею.

Оператор сравнения проверяет, подходит ли проверяемое выражение под
шаблон, и возвращает значение 1, если это так, и значение 0 в
противном случае. Запись этого оператора состоит из буквы m,
разделителя (чаще всего это косая линия - /, но в принципе это может
быть почти любой символ), шаблона и еще одного разделителя (такого же,
как и первый :).

Оператор сравнения
$_ = ;
if (m/hello/) {
print "hello user\n";
}

if ($input{'siteurl'} =~ #http://#) {
print $input{'siteurl'};
}

В этом примере проверяется, есть ли в строке, полученной со
стандартного входа, слово 'hello'. Если это так (оператор m// вернет
значение 1), то на стандартный выход вернется фраза 'hello user'.

Примечание:вообще-то символ 'm' является необязательным, поэтому
оператор из этого примера может выглядеть просто как /hello/.

Оператор подстановки находит в строке все подстроки, удовлетворяющие
шаблону, и заменяет их некоторым другим значением. Запись этого
оператора состоит из буквы s, указывающей на то, что это собственно
оператор подстановки и исходного (что заменять) и подстановочного (на
что заменять) шаблонов, разделенных разделителями.

Оператор подстановки
$_ = 'My name is Fred';
# oh no, my name is Jonathan!
s/Fred/Jonathan/;

В этом примере в строке $_ все слова Fred будут изменены на Jonathan.

Оператор перевода также производит подстановку, но несколько другого
характера - он используется для замены отдельных символом некоторыми
другими (определенными) символами. Синтаксис этого оператора похож на
синтаксис оператора подстановки, с тем отличием, что во-первых он
очевидно начинается с букв tr, а между разделителями вставляются не
шаблоны, а группы символов, первая - исходные символы, вторая подстановочные, причем соответствующие символы должны стоять на
одинаковых позициях в своих группах - если вы хотите заменить,
например латинскую 'm' на кириллическую 'м', они должны стоять на
одинаковых местах: 'm' - в первой группе символов, 'м' - во второй.

Оператор перевода
$_ = 'hi.there, my.name.is.jonathan,';
tr/.,/ !/;

В этом примере все запятые будут изменены на восклицательные знаки, а
точки - на пробелы.
Модификаторы

Возможности каждого из этих операторов можно расширить при помощии
модификаторов. Модификаторы - это грубо говоря символы которые
дописываются к оператору (например, так - s/fred/Jonathan/i), говоря о
том, как ему нужно разбирать рабочее значение.

Модификаторы для оператора сравнения:
g - находит все найденные подстроки;
i - игнорирует регистр символов в строке;
m - рассматривает строку как многострочное значение;
s - рассматривает строку как однострочое значение;
x - позволяет использовать расширенные регулярные выражения;

Модификаторы для оператора подстановки:
e - вычисляет подстановочное выражение перед подстановкой;
g - находит все найденные подстроки;
i - игнорирует регистр символов в строке;
m - рассматривает строку как многострочное значение;
s - рассматривает строку как однострочое значение;
x - позволяет использовать расширенные регулярные выражения.

Модификаторы

$_ = 'My name is Fred';
s/fred/Jonathan/i; # My name is Jonathan
s/jonathan/routine()/ie; # My name is [something]
Операции =~ и !~

Операции =~ и !~ позволяют использовать с операторами m//, s/// и
tr/// любые переменные, а не только $_, которая используется этими
операторами по умолчанию.

Оператор =~ выполняет те же функции, что и оператор присваивания '='
(в случае использования с операторами s/// и tr///) и оператор
сравнения 'eq' (при использовании с оператором m//).

Операция =~
$name = 'my name is Fred';
$name =~ s/fred/Jonathan/ig;

$string = 'hello world';
if ($string =~ /hello/i) {
print 'helloworlded in this string.';
}

Аналогично, операция !~ используется так же как и операция 'ne' (ее
написание подобно операции чисельного сравнения !=), используется
только с оператором сравнения и означает отрицание удовлетворения
шаблону.

Операция !~
$string = 'good';
if ($string !~ /bad/) {
print "hey, it's not too bad yet!";
}
Память

И напоследок - о возможности более удобно работать с результатами
обработки регулярных выражений, а именно о хранении их в отдельных
переменных. Такими переменными являются предопределенные $&, $`, $', и
набор переменных $1, $2, ..., $9.

Переменная $&

Эта переменная предназначена для хранения фрагмента строки, который
удовлетворил шаблону, заданному регулярным выражением. Это удобно в
таких случаях, как, например, если нужно найти число в строке, но
неизвестно, что это за число. Вот как это может выглядеть:

$string = "error 404."
$string =~ m/\d+/;
$number = $&; # $number содержит "404"

Переменные $` и $'

Эти переменные служат для хранения фрагментов, которые не
удовлетворили шаблону, а именно подстрок, которые стоят до и после
результата соответственно. Другими словами, после операции, например,
сравнения, значение исходой строки разделяется на три части - часть,
которая подошла под шаблон, и фрагменты, которые идут перед ней и
после нее. Эти части и помещаются в переменные $&, $` и $'
соответственно. (Обратите внимание на то, что в первой переменной обратная кавычка, а во второй - прямая). Посмотрим на предыдущий
пример.

$string = "error 404."
$string =~ m/\d+/;

$number = $&; # $number содержит "404"
$before = $`; # $before содержит "error"
$after = $'; # $after содержит "."
Переменные $1..$9

Эти переменные служат для хранения фрагментов строки, которые
удовлетворили соответсвующим определенным фрагментам шаблона. В
шаблоне фрагменты выделяются при помощи скобок. Каждому фрагменту
выделяется номер в том порядке, в котором они расположены, и
соответствующая переменная будет содержать его значение.

$string = "this is to be uppercased";
$string =~ s/(upper\w+)/uc($1)/;
# $string = "this is to be UPPERCASED"

$string = "15 apples, 2 foos, 3 bars";
while ($string =~ m/(\d+) (\w+)/g) {
print "$2: $1\n";
}
# Выведет apples: 15
# foos: 2
# bars: 3

Perl   Теги: Perl

Читайте также:

Perl

Perl и ошибка 500

E-Mail на Perl



Редакция портала:

Благодарим за просмотр этой информации на нашем компьютерном портале. Надеемся, что обзор Регулярные выражения в Perl, в разделе Perl вам понравился. Есть небольшая рекомендация, если вы хотите быть в курсе всех событий сферы информационных технологий, то рекомендуем зарегистрироваться на портале www.stfw.ru.


Живая лента

•  Флагманский смартфон Meizu 16s показался на качественном рендере - 21.11.2018: STFW.Ru: Только в августе были представлены флагманские смартфоны Meizu 16 и Meizu 16 Plus, а у


•  Украинский документальный фильм о Майдане и российской военной агрессии поборется за «Оскар» - 21.11.2018: STFW.Ru: Украинский фильм «Переломный момент: Война за демократию в Украине» будет


•  Между Днепром и Запорожьем планируют построить новый аэропорт - 21.11.2018: STFW.Ru: Как сообщил глава Днепропетровского областного совета Глеб Прыгунов на


•  «По-богатому»: Новые модули памяти G.Skill с «позолотой» и «драгоценными камнями» - 21.11.2018: STFW.Ru: Модули оперативной памяти G.Skill всегда выделялись внешним исполнением, но с


•  «Киевский метрополитен» и «Киевметрострой» подписали договор на продление метро до Виноградаря - 21.11.2018: STFW.Ru: Киевские власти дали толчок началу строительства метро на столичный жилой


•  Volvo Trucks поставит в Норвегию первые беспилотные грузовики Volvo FH, которые будут самостоятельно транспортировать грузы по сложному маршруту - 21.11.2018: STFW.Ru: Автопроизводитель Volvo Trucks подписал с норвежской компанией Brnny Kalk AS договор о