m// в списочном контексте

При использовании split шаблон задает разделитель (части строки, не содержащие полезных данных). Иногда бывает проще задать тот текст, который вы хотите сохранить. При использовании оператора поиска по шаблону (m//) в списочном контексте возвращаемое значение представляет собой список переменных, созданных для совпадений, или пустой список (если поиск завершился неудачей):

$_ = "Hello there, neighbor!";
my($first, $second, $third) = /(\S+) (\S+), (\S+)/;
print "$second is my $third\n";

Это позволяет легко присвоить переменным понятные удобные имена, которые будут действовать и после следующего поиска по шаблону. (Также обратите внимание на то, что в коде отсутствует оператор =~, поэтому шаблон по умолчанию применяется к $_.) Модификатор /g, впервые встретившийся нам при описании s///, работает и с m//; он позволяет найти совпадение в нескольких местах строки. В этом случае шаблон с парой круглых скобок будет возвращать элемент списка для каждого найденного совпадения:

my $text = "Fred dropped a 5 ton granite block on Mr. Slate";
my @words = ($text =~ /([a-z]+)/ig);
print "Result: @words\n";
# Result: Fred dropped a ton granite block on Mr Slate

Происходящее напоминает «split наоборот»: вместо того что необходимо удалить, мы указываем, что необходимо оставить.


Если шаблон содержит несколько пар круглых скобок, для каждого совпадения может возвращаться более одной строки. Предположим, у нас имеется строка, которую необходимо прочитать в хеш:

my $data = "Barney Rubble Fred Flintstone Wilma Flintstone";
my %last_name = ($data =~ /(\w+)\s+(\w+)/g);

При каждом совпадении шаблона возвращаются два частичных совпадения. Эти два совпадения образуют пары «ключ-значение» в создаваемом хеше.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Глобальная замена (/g)
Другие возможности регулярных выражений
Другие ограничители
Замена с использованием оператора s///
Минимальные квантификаторы