Регулярные выражения в 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 |