Я удивлен, что никто не упомянул специальную переменную, которая делает это, $'
: "$'
" возвращает все после соответствующей строки. ( perldoc perlre )
my $str = 'axxxghdfx445';
$str =~ /x/;
# $' contains '445';
print $';
Тем не менее, есть стоимость (выделено мое):
ВНИМАНИЕ: Как только Perl увидит, что вам нужен один из $ &, "$ ", or "$'" anywhere
in the program, it has to provide them for every pattern match. This
may substantially slow your program. Perl uses the same mechanism to
produce $1, $2, etc, so you also pay a price for each pattern that
contains capturing parentheses. (To avoid this cost while retaining
the grouping behaviour, use the extended regular expression "(?: ... )"
instead.) But if you never use $&, "$
" или "$ '", тогда шаблоны без
захват скобок не будет оштрафован. Так что избегайте $ &, "$ '" и
«$` », если вы можете, но если вы не можете (и некоторые алгоритмы действительно
цените их), как только вы использовали их один раз, используйте их по желанию, потому что
Вы уже заплатили цену. По состоянию на 5.005 $ & не так дорого, как
два других.
Но подождите, это еще не все! Вы получаете двух операторов по цене одного, действуйте СЕЙЧАС!
В качестве обходного пути для этой проблемы в Perl 5.10.0 вводится
«$ {^ PREMATCH}», «$ {^ MATCH}» и «$ {^ POSTMATCH}», которые эквивалентны
в $ `, $ & и $ $, за исключением того, что они гарантированно
определяется после успешного совпадения, которое было выполнено с "/ p"
(сохранить) модификатор. Использование этих переменных не требует
штраф за производительность, в отличие от их знаков препинания, однако
при компромиссе, который вы должны сообщить Perl, когда хотите их использовать.
my $str = 'axxxghdfx445';
$str =~ /x/p;
# ${^POSTMATCH} contains '445';
print ${^POSTMATCH};
Я бы смиренно утверждал, что этот маршрут самый лучший и самый простой
подход в большинстве случаев, так как это не требует, чтобы вы делали специальные вещи
с вашей структурой шаблона для извлечения части postmatch, и там
нет потери производительности.