.... следующее совпадение в цикле начинается с? =
Следующее совпадение в //g
начинается там, где закончилось последнее совпадение.A (?=...)
магически не устанавливает позицию, с которой начнется следующий матч;он просто проверяет, совпадает ли деталь внутри (?=...)
в текущей позиции, не продвигая позицию.
Если ваше регулярное выражение будет /(a\d(?=a\d))/
, тогда совпадение будет выполнено после первого a\d
, хотяуверен, что за ним стоит второй a\d
.Но ваше регулярное выражение /(a\d(?=a\d)a\d)/
, что означает упрощенное отношение к совпадению /a\da\d/
, то есть оно выполняется после второго a\d
.
. Что вы можете сделать, чтобы достичь того, чего хотите, например, следующее:
my $s1 = 'a1a2a3a4a5';
while($s1 =~ m/(a\d(?=(a\da\d)))/g)
{
print "$1$2\n"
}
Это поместит первое a\d
в $1
, захватит второе a\da\d
в $2
, но все равно завершит матч после первого a\d
.Только вам нужно вывести "$1$2"
, а не только "$1"
.