ПрограммированиеPerl разработчик

Перечислите особенности регулярных выражений Perl. Какие существуют модификаторы и как правильно обрабатывать результаты сопоставления? Приведите пример парсинга строки с помощью регулярного выражения.

Проходите собеседования с ИИ помощником Hintsage

Ответ

Perl — один из сильнейших языков для работы с регулярными выражениями. Для сопоставления используют операторы =~ и !~.

Модификаторы регулярных выражений:

  • i — регистр не важен
  • g — глобальный поиск (все вхождения)
  • m — многострочный режим (работает ^ и $ на каждую строку)
  • s — точка (.) включает символ новой строки

Пример:

my $text = "My email: max@mail.com and ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }

В этом примере цикл извлекает все email из строки.

После сопоставления значения захватываются в специальные переменные $1, $2, ... (по каждой захватывающей группе).

Вопрос с подвохом

Что будет храниться в переменной $1 после неудачного поиска по регулярному выражению?

Ответ:

$1 не обновляется при неуспешном совпадении — оно хранит значение последнего успешного сопоставления. Это потенциальный источник ошибок! Чтобы избежать этого, в сложных условиях лучше явно очищать $1, $2, ...

Примеры реальных ошибок из-за незнания тонкостей темы


История

Валидация входных данных сложным регулярным выражением зависела от значения $1. После очередного сопоставления, не нашедшего подходящей строки, переменная $1 не изменилась, и обработка прошла по старому неправильному email адресу.


История

Программист ошибся с модификатором. В большом тексте применили /abc/g, рассчитывая на многострочный режим. В результате паттерн не находил нужные строки с переносами, хотя надо было использовать /abc/ms.


История

В проекте забыли использовать глобальный флаг /g при поиске всех вхождений. Следствие — скрипт извлекал только первое совпадение, а пользователь ждал полный список данных.