Введение в Perl

?PATERN?


Действие этого оператора аналогично /шаблон/, но выполняется до первого совпадения. Это удобно для поиска наличия какой-нибудь строки в одном или множестве файлов. Это не очень удачный оператор, поэтому в следующих версиях Perl его возможно не будет.

m/PATERN/gimosx

/PATERN/gimosx

Поиск в строке по патерну (шаблону). В скалярном контексте возвращает логическое значение true (1) или false (''). Если строка не указана с помощью операторов '=~' или '!~', поиск ведется в строке $_

Опции:

g- Глобальный поиск. Поиск всех вхождений.
i- Сравнение не зависит от регистра (верхний или нижний)
m- Строка многострочная.
o- однопроходная компиляция
s- однострочная строка
x- используются расширенные регулярные выражения.

Если '/' - ограничитель, то начальное 'm' можно опустить. С помощью него в качестве ограничителя может быть любой символ кроме пробела.



PATTERN может содержать переменные, которые будут интерполироваться (перекомпилироваться) каждый раз в момент вычисления. Переменные $) и $| не интерполируются. Если вы хотите, что бы такой шаблон интерполировался один раз - добавьте /o. Это необходимо делать в циклах поиска для увеличения быстродействия, однако, если вы измените значение переменной, Perl этого даже не заметит.

Если PATERN - нулевая строка, то используется последнее регулярное выражение.

В скалярном контексте возвращается список элементы которого - результаты выполнения выражений в скобках патерна ($1, $2, $3...). Обратите внимание что первый элемент $1.

Пример:

$a = "/usr/local/perl/perl.bin"; # Анализируемая строка

Цель: Создать массив @dirs с именами директорий.

Решение:

Самый простой способ воспользоваться split('\/') но в качестве примера используем скобки.

@dirs =~ m[/(\w*)/(\w*)/(\w*)/(\w*)]

Здесь 'm[' - использовать квадратные скобки как ограничители. (\w*) - шаблон алфавитно-цифровой последовательности.

В результате @dirs равен ('usr', 'local', 'perl')

q/строка/

'строка'

Строка литералов. Не интерполируется. Внутри строки разрешается использовать \' или \\ для обозначения символов ' и \ .


Пример:

print q#Привет.#; # Результат Привет.

print 'O\'K'; # O'K

qq/строка/

"строка"


Интерполируемая строка.

Пример:

$var = 13; print "\$var = $var";

Результат: $var = 13



qx/строка/

`строка`


Сначала строка интерполируется, а потом выполняется как системная команда.

Пример:

print `date`;

Результат: Thu Nov 14 13:36:49 MSK 1996



qw/строка/


Возвращает список, элементы которого - слова строки, разделенные пробелами.

Пример:

print qw/Построимся и спасемся!/; # ('Построимся','и','спасемся!')

Результат:

Построимсяиспасемся!

Часто применяется как:

use POSIX qw( setlocale localeconv ) @EXPORT = qw( proc1 var );

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/таблица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; # Удалить все не буквы. Результат 'Hello'

Если один и тот же символ несколько раз указан в таблице1, то применяется только первая замена.


Содержание раздела