Чтение онлайн

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

my $string = "Уже скоро скоро наступит весна!";

my $pattern = '(\S+)\s+\1';

# (\S+) сохранит значение 'скоро' в \1

$string =~ m/$pattern/; # соответствие: 'скоро скоро'

Операция сопоставления, употребленная в списочном контексте, возвращает список найденных соответствий, для которых было предусмотрено сохранение значений. Поэтому удобно сохранять найденные значения в массиве или в списке скалярных переменных. Например, извлечем из текстовой строки

последовательность цифр, похожую на время:

my $text = 'Начало в 12:25:00.'; # строка с данными

my $pattern = '(\d\d):(\d\d):(\d\d)'; # образец для поиска

my @time = $text =~ m/$pattern/; # сохраним в массиве

my ($hh, $mm, $ss) = $text =~ m/$pattern/; # и в списке

Можно находить любое количество соответствий образцу в одной операции сопоставления. Это делается с помощью модификатора глобального поиска.

До сих пор операция сопоставления прекращала работу и возвращала результат, когда находилось первое соответствие строки указанному шаблону. Если для операции сопоставления указать модификатор /g (global), то она будет искать в строке все соответствия образцу, организуя неявный цикл обработки регулярного выражения. Например, так можно найти все числа в строке с помощью одного шаблона:

my @numbers = 'Не 12.5, а 25!' =~ /(\d+)/g; # глобальный поиск

# в @numbers будет (12, 5, 25)

Ранее в этой лекции уже упоминался модификатор /i, устанавливающий поиск с игнорированием разницы между заглавными и строчными буквами. Перечислим модификаторы для операции сопоставления:

[x]. /g– искать в тексте все соответствия образцу (Global);

[x]. /i– искать соответствие образцу без учета регистра букв (case-Insensitive);

[x]. /s– рассматривать текст как одну строку (Single-line);

[x]. /m– рассматривать текст как многострочный (Multi-line) с учетом \n ;

[x]. /o– один раз откомпилировать регулярное выражение (Once);

[x]. /x– использовать расширенный синтаксис регулярных выражений (eXtended).

Из всех модификаторов, пожалуй, самый интересный - последний, который позволяет записывать регулярные выражения в структурированном и понятном для человека виде и даже сопровождать комментариями! Так, например, можно более понятно и красиво переписать регулярное выражение, приведенное в начале лекции:

m/ # начало регулярного выражения

<A # начало тега: <A

[^>]+? # далее могут быть любые символы, кроме >

HREF # определение гиперссылки

\s*=\s* # знак =, возможно окруженный пробелами

["']? # может быть открывающая кавычка или апостроф

( # начало захвата значения

[^'" >]+? #
адрес ссылки: все, кроме ',",пробела и >

) # конец захвата значения

['"]? # может быть закрывающая кавычка или апостроф

\s* # за которым могут быть пробелы

> # конец тега

/igx; # конец регулярного выражения

# соответствует, например: <a id='ru' href="#">

Записанное в таком виде, регулярное выражение становится доступным для понимания, анализа и модификации. А поскольку регулярные выражения компилируются, то пробельные символы и комментарии не влияют на быстродействие программы.

Кроме поиска, регулярные выражения часто применяются для замены найденных совпадений на новые значения. Для этого существует операция замены (substitution), которая пытается найти в строковой переменной соответствие образцу, а если находит, то заменяет найденную подстроку на указанное значение. Операция замены выглядит так:

$variable =~ s/образец/замена/;

# в переменной $variable отыскивается строка 'образец',

# и если найдена, то она заменяется на 'замена'

Все, что говорилось до этого про операцию сопоставления, применимо для левой части операции замены, в которой указывается образец поиска. Левая и правая части операции замены интерполируются, поэтому там могут использоваться escape-последовательности и переменные.

$pattern = 'шило'; # образец

$replacement = 'мыло'; # замена

$text =~ s/$pattern/$replacement/; # поменять 'шило' на 'мыло'

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

$text = 'мать любит дочь';

$text =~ s/(\S+)\s+(\S+)\s+(\S+)/\3 \2 \1/;

# в $text будет 'дочь любит мать'

Для операции замены s/// можно применять все модификаторы, упомянутые для операции сопоставления m//. Например, модификатор /g указывает, что должны быть заменены все найденные в тексте соответствия. Например:

$our_computers =~ s/Windows/Linux/g;

У операции замены есть дополнительный модификатор /e (expression evaluation), при включении которого заменяющая часть вычисляется как выражение. При этом в заменяющей части можно использовать ссылки на захваченные при помощи круглых скобок соответствия. Это можно применять для более "интеллектуальной" замены найденных соответствий. Так, например, можно перевести температуру из шкалы Цельсия в шкалу Фаренгейта:

$text = 'Бумага воспламеняется при 233C.';

Поделиться:
Популярные книги

Записки Филиппа Филипповича Вигеля. Части первая — четвертая

Вигель Филипп Филиппович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Записки Филиппа Филипповича Вигеля. Части первая — четвертая

Паслен

Лейк Кери
1. Паслен
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Паслен

"Фантастика 2023-121". Компиляция. Книги 1-25

Башибузук Александр
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-121. Компиляция. Книги 1-25

Неугодная невеста Дракона, или Тайна леди Дойл

Александер Мари
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Неугодная невеста Дракона, или Тайна леди Дойл

Варяжская сталь: Герой. Язычник. Княжья Русь

Мазин Александр Владимирович
Варяг
Фантастика:
боевая фантастика
попаданцы
альтернативная история
8.67
рейтинг книги
Варяжская сталь: Герой. Язычник. Княжья Русь

Шесть с половиной ударов в минуту

Пушкарёва Рить
Фантастика:
фэнтези
5.00
рейтинг книги
Шесть с половиной ударов в минуту

В поисках Силы или канон давай до свиданья, или...

N.B.
3. Неудачный выбор
Фантастика:
юмористическое фэнтези
попаданцы
рпг
5.00
рейтинг книги
В поисках Силы или канон давай до свиданья, или...

Экстремальные ситуации

Малкина-Пых Ирина Германовна
Справочник практического психолога
Научно-образовательная:
психология
5.00
рейтинг книги
Экстремальные ситуации

Весы Ишкура (ex. Восхождение 3.0)

Жгулёв Пётр Николаевич
16. Real-RPG / Город Гоблинов
Фантастика:
рпг
уся
попаданцы
5.00
рейтинг книги
Весы Ишкура (ex. Восхождение 3.0)

Твердь: русская борзая. Дилогия

Каляева Яна
Твердь: русская борзая
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Твердь: русская борзая. Дилогия

Посмертные записки Пиквикского клуба

Диккенс Чарльз
Проза:
классическая проза
5.00
рейтинг книги
Посмертные записки Пиквикского клуба

Арнольд и я. Жизнь в тени Австрийского Дуба

Аутланд Барбара Бейкер
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Арнольд и я. Жизнь в тени Австрийского Дуба

НИ. Тетрология

Осьминожкин Евгений Александрович
Наказан играть
Фантастика:
фэнтези
6.25
рейтинг книги
НИ. Тетрология

Уиронда. Другая темнота (сборник)

Музолино Луиджи
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Уиронда. Другая темнота (сборник)