| 
 Урок 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] 
[приложение Б] 
[приложение В] 
[заключение] 
[благодарности] 
 
  |