Урок 22. Операторы поиска и замены
Оператор m//
m/PATERN/gimosx;
/PATERN/gimosx;
Поиск в строке по паттерну (шаблону). В скалярном контексте возвращает логическое значение true (1) или false (''). Если строка не указана с помощью операторов '=~' или '!~', поиск ведется в строке $_ . Опции:
g |
- Глобальный поиск.
Поиск всех вхождений. |
i |
- Сравнение не
зависит от регистра (верхний
или нижний) |
m |
- Строка
многострочная. |
o |
- однопроходная
компиляция |
s |
- однострочная
строка |
x |
- используются
расширенные регулярные
выражения. |
Если '/' - ограничитель, то начальное 'm' можно опустить. С помощью него в качестве ограничителя может быть любой символ кроме пробела.
PATTERN может содержать переменные, которые будут интерполироваться (перекомпилироваться) каждый раз в момент вычисления. Переменные $) и $| не интерполируются. Если вы хотите, что бы такой шаблон интерполировался один раз - добавьте /o. Это необходимо делать в циклах поиска для увеличения быстродействия, однако, если вы измените значение переменной, Perl этого даже не заметит.
Если PATERN - нулевая строка, то используется последнее регулярное выражение.
В скалярном контексте возвращается список элементы которого - результаты выполнения выражений в скобках паттерна ($1, $2, $3...). Обратите внимание что первый элемент $1.
Оператор S///
s/шаблон/подстрока/egimosx;
Поиск по шаблону и в случае успеха замена подстрокой. Возвращает количество произведенных подстановок, иначе false (0). Если строка в которой ведется поиск не указана (операторы =~ или != ), то используется переменная $_ . Если в качестве разделителя '/' использовать одинарную кавычку ('), то интерполяции не будет, иначе можно применять переменные в шаблоне или подстроке. Опции:
e |
- Рассматривать
правую часть как выражение. |
g |
- Глобальный поиск. |
i |
- Без различия
регистра букв |
m |
- многострочная
переменная |
o |
- компилировать
шаблон один раз |
s |
- однострочная
переменная |
x |
- расширенное
регулярное выражение |
Разделитель '/' можно заменить на любой алфавитно-цифровой символ кроме пробела.
$var = "12345"; # исходная строка
$var =~ s/1/0/; # Заменить '1' на '0'. Результат 02345
$var =~ s(5)(.); # Заменить '5' на '.' Результат 0234.
Здесь в качестве разделителя применены скобки, поэтому подстрока взята в две скобки.
$var =~ s/\d*/каламбур/; #Заменить все цифры. Результат 'каламбур.'
$var =~ s/а/о/g; # Заменить все 'а' на 'о'. Результат 'коломбур.'
$var = "12 34"; # Новое значение
$var =~ s/(\d\d) (\d\d)/$2 $1/; # Поменять местами числа. Результат '34 12'.
Операторы tr/// и y///
tr/таблица1/таблица2/cds;
y/таблица1/таблица2/cds;
Замена всех символов из "таблица1" на соответствующий символ из "таблица2". Результат - количество замен или стирании. Без оператора =~ или != операция выполняется со строкой $_. Для совместимости с программой sed вместо tr можно писать 'y'. Опции:
c |
- дополнение
"таблица1" |
d |
- стереть найденные,
но не замененные символы. |
s |
- "сжать"
повторяющиеся замененные
символы. |
Если указана опция /d таблица2 всегда интерпретируется как положено. Другими словами, если таблица2 короче, чем таблица1, то символ из таблицы1 интерпретируется всегда. Если таблица2 - null, то все символы строки остаются неизменными. Это удобно для подсчета количества символов в строке определенного класса или для сжатия повторяющихся символов, например, пробелов.
$s = "hello"; # Исходная строка
$s =~ tr/a-z/A-Z/; # Заменить малые буквы на большие. Результат
# 'HELLO'
$s = 'Hel....lo';
$s =~ tr/a-zA-z/_/c; # Заменить все не буквы на '_'
# Результат 'Hel____lo'
$s =~ tr/_/ /s; # Заменить '_' на ' ' и сжать.
# Результат 'Hel lo'
$s =~ tr/a-zA-Z /a-zA-Z/d; # Удалить все не буквы. Результат 'Hel
* * * *
Попробуйте написать функцию, которая запрашивает выражение и число. Функция должна возвращать номера слов в выражении, длина которых превышает переданное число.
Дополнительная информация: [регулярные выражения]
[Содержание]
[Вступление]
[необходимое для начала изучения]
[урок 1]
[урок 2]
[урок 3]
[урок 4]
[урок 5]
[урок 6]
[урок 7]
[урок 8]
[урок 9]
[урок 10]
[урок 11]
[урок 12]
[урок 13]
[урок 14]
[урок 15]
[урок 16]
[урок 17]
[урок 18]
[урок 19]
[урок 20]
[урок 21]
[урок 22]
[урок 23]
[урок 24]
[урок 25]
[урок 26]
[урок 27]
[урок 28]
[правила хорошего тона]
[приложение A]
[приложение Б]
[приложение В]
[заключение]
[благодарности]
|