Введение в Perl - Маслов Владимир Викторович. Страница 7
\b – граница слова
\B – не граница слова
\A – начало строки
\Z – конец строки
\G – конец действия m//g
Граница слова (\b) – это мнимая точка между символами \w и \W.
Внутри класса символов '\b' обозначает символ backspace (стирания).
Метасимволы \A и \Z – аналогичны '^' и '$' но если началостроки '^' и конец строки '$' действуют для каждой строки в многосторочной строке то \A и \Z обозначают начало и конец всей многосторчной строки.
Если внутри шаблона применяется группировка (круглые скобки) то номер подстроки группы обозначается как '\цифра'.
Заметьте что за шаблоном в пределах выражения или блока эти группы обозначаются как '$цифра'. Кроме этого существуют дополнительные переменные:
$+ – обозначает последнее совпадение
$& – все совпадение
$` – все до совпадения
$' – все после совпадения
Пример:
$s = «Один 1 два 2 и три 3»;
if ($s =~ /(\d+)\D+(\d+)/)
{
print «$1\n»; # Результат '1'
print «$2\n»; # '2'
print «$+\n»; # '2'
print «$&\n»; # '1 два 2'
print «$`\n»; # 'Один '
print «$'\n»; # ' и три 3'
}
Перл версии 5 содержит дополнительные конструкции шаблонов:
(?#комментарий) – комментарий в теле шаблона.
(?:шаблон) – группировка как и '( )' но без обратной ссылки
(?=шаблон) – «заглядывание» вперед.
Например /\w+(?=\t)/ соответствует слову за которым идет табуляция но символ '\t' не включается в результат.
Пример:
$s = «1+2-3*4»;
if ($s =~ /(\d)(?=-)/) # Наити цифру за которой стоит '-'
{
print «$1\n»; # Результат '2'
}
else { print «ошибка поиска\n»;}
(?!шаблон) – «заглядывание» вперед по отрицанию.
Пример:
$s = «1+2-3*4»;
if ($s =~ /(\d)(?!\+)/) # Наити цифру за которой не стоит '+'
{
print «$1\n»; # Результат '2'
}
else { print «ошибка поиска\n»;}
(?ismx) – «внутренние» модификаторы. Удобно применять в шаблонах где например нужно внутри шаблона указать модификатор.
Правила регулярного выражения. (regex)
1. Любой символ обозначает себя самого если это не метасимвол. Если вам нужно отменить действие метасимвола то поставьте перед ним '\'.
2. Строка символов обозначает строку этих символов.
3. Множество возможных символов (класс) заключается в квадратные скобки '[]' это значит что в данном месте может стоять один из указанных в скобках символ. Если первый символ в скобках это '^' – значит не один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-' обозначающий диаппазон символов. Например a-z один из малых букв латинского алфавита, 0-9 – цифра и т.д.
4. Все символы, включая специальные можно обозначать с помощью '\' как в языке С.
5. Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ.
6. Внутри регулярного выражения можно указыват «подшаблоны» заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
Операторы и приоритеты
В Перл ассоциативность и приоритетность операторов аналогична языку C Ниже перечислены все операторы в порядке уменьшения приоритета, в начале строки указана ассоциативность.
ассоц. операторы
– –
левая термы и левосторонные списковые операторы
левая ->
– ++ –
правая **
правая ! ~ \ унарные + и -
левая =~ !~
левая * / % x
левая + – .
левая << >>
– именованные унарные операторы
– < > <= >= lt gt le ge
– == != <=> eq ne cmp
левая &
левая | ^
левая &&
левая ||
– ..
правая ?:
правая = += -= *= и т.д.
левая , =>
– правосторонние списковые операторы
левая not
левая and
левая or xor
Любой терм имеет самый высокий приоритет. К терму относятся переменные, кавычки и их операторы, арифметические и логические выражения в скобках, любые функции с параметрами в скобках. Фактически таких функций нет так как это просто унарные и списковые операторы просто они ведут себя подобно функциям с параметрами в скобках. Подробно смотри главу «Функции».
Если после любого спикового оператора ( print(), и т.д.) или унарного оператора (chdir(), и т.д.) следует левая круглая скобка, то операторы внутри скобок имеют наивысший приоритет. Так же как и обычные функции.
Если скобки отсутсвуют то приоритет списковых операторов или наивысший или наименьший в отношении операторов справа или слева от него.
Например:
@i = ('a ','b ', print 'c ', 'd ');
print «\n»,@i,"\n";
Результат:
c d
a b 1
Здесь мы имеем списковый оператор print. Для запятых слева от него он имеет наименьший приоритет, но повышает приоритет правой запятой.
Поэтому правая запятая воспринимается как параметр для print и печатается 'c d' а левая просто записывает код завершения операции в массив @i и последний print показывает это.
Так же как в С или С++ это инфиксный оператор переадрессации. Если справа от него стоит [...] или {...} выражение, то правая часть может быть непосредственной или символической ссылкой на массив или хеш.
В противном случае правая сторона это метод или простой скаляр содержащий имя метода, а правая или объект или имя класса. Подробно смотри главу «Классы».
Эти операторы работают так же как и в С. Если оператор стоит перед переменной то значение переменной изменяется на 1 и полученной значение используется. Если после переменной то ее величина изменяется после применения.
Употребление инкремента к строковым переменным в Перл имеет одну особенность.
Каждый символ остается в своем классе (большие, малые, цифры) и учитывается перенос предыдущего символа. Таким образом строковые переменные с цифрами работают как числовые переменные.
Пример:
print ++($i = «09»); # Результат «10»
print ++($i = «a9»); # «b0»
print ++($i = «az»); # «ba»
print ++($i = «aZ»); # «bA»
Пример:
print 4**2 # Результат 16
print -4**2 # Результат -16 т.е. -(4**2)
'!' – логическое отрицание
'-' – арифметический минус
'~' – побитная инверсия (дополнение до 1)
'+' – арифметический плюс
'\' – получение ссылки на переменную (как & в С)
Эти «необычные» я бы даже сказал оригинальные операторы имеют очень широкое применение в Перл. Можно даже назвать их «оригинальным» решением.
Оператор =~ логически связывает левую часть выражения с патерном (pattern – образец, шаблон, модель) в правой. По умолчанию поиск или изменение по патерну выполняется в переменной $_ Операторы привязки позволяют делать это с любой переменной указанной в левой части. Логическим результатом будет успех операции. Если в правой части вместо патерна присутсвует выражение, то результат этого выражения воспринимается как патерн. Однако это не очень эффективно т.к. патерн будет компилироваться во время исполнения программы что заметно снизит быстродействие.