По умолчанию для сопоставления с образцом в Perl оставлен самый длинный, самый длинный *.Использование ??
, *?
или +?
изменит эту часть на «Самый левый», «Самый короткий», но «Самый левый» по-прежнему имеет приоритет.
Существует способ заставить Perl соответствовать «Мому правый», что можетдайте вам желаемый эффект, но это также приведет в замешательство следующего человека, который будет читать ваш код, поэтому используйте его с осторожностью.
Основная идея состоит в том, чтобы полностью изменить все, что связано с сопоставлением с образцом, поэтомустановится левым.
my $subject = 'ajjjjjjjjjaab';
my $rev_sub = reverse $subject; # reverse the string being matched.
my $result;
if ($rev_sub =~ /(b.*?a)/) { # reverse the pattern to match.
$result = reverse $1; # reverse the results of the match.
}
print $result;
Решения, предоставленные ikegami и Kobi, оба находят аналогичные результаты для вашего примера.В зависимости от ваших реальных шаблонов и строк, вы можете найти очень разную производительность для каждого метода.Всегда Benchmark
исходя из ваших реальных потребностей.
* Дольше только для сопоставляемого непосредственного токена, исключая чередования, которые пробуются в порядке слева направо и т. Д.