Я не думаю, что мы получим идеальный ответ на этот вопрос, потому что он такой расплывчатый, но здесь идет.буферы для упрощения вашей работы.Короче говоря, вы можете ссылаться на текстовые группы (блоки внутри ()
) внутри регулярного выражения таким же образом, как вы делаете после инициализации.Вы просто ссылаетесь на них обратной косой чертой (\
) вместо знака доллара ($
).
Этот код предполагает, что у вас есть весь доступный для поиска буфер.Если вы хотите сделать это построчно, вам понадобится счетчик тегов (или другой подобный механизм), чтобы убедиться, что вы можете обрабатывать рекурсивные строки (если ваш блок сообщений сам по себе может содержать блоки сообщений)
#!/usr/bin/perl
use warnings;
use strict;
my $buf = 'this is a junk line
this is a junk line2
this is a junk line3
message1
this is first line of text
this is second line of text
this is third line of text
this is fourth line of text
this is fifth line of text
message1_end
the next line';
if($buf =~m/(message\d)(.*?)(\1_end)/sg) {
my $message = $2;
# ...
}
Здесь \d
соответствует одной цифре (см. Ссылку perldoc), а \1
соответствует тому же значению, что и $1
("message1").Поскольку маркер начала отличается от маркера конца только на «_end», мы используем маркер начала, чтобы создать искомый маркер конца.Благодаря этому код будет отлично работать для нескольких сообщений («message1», «message2», ..).