Странное поведение Perl Regexp (не ищет 2 раза)

Имеем perl v5.10.1 CentOs 6.10. Как можно объяснить такое поведение регулярных выражений в Perl

my $text = "Hello olleH";
$text =~ /olleH/g;
print $&."\n";
$text =~ /Hello/g;
print $&."\n";

при выполнении этого кода поиск происходит только в первом выражении, ответ:

olleH olleH

Но если их поменять местами то тогда срабатывают обе

my $text = "Hello olleH";
$text =~ /Hello/g;
print $&."\n";
$text =~ /olleH/g;
print $&."\n";

Hello olleH

Можно еще убрать в первом коде ключ g тогда тоже получаем что нужно. Такое впечатление что в первом варианте поиск доходит до конца строки и во втором начинать с начала не хочет. Я где то просмотрел и подобное поведение логично?


Ответы (1 шт):

Автор решения: Mike

Модификатор регулярных выражений g, будучи примененным в скалярном контексте, запоминает позицию в анализируемой строке на которой остановился. И при следующем применении начинает поиск с этой позиции.

Для получения или изменения текущей позиции может быть использована функция pos():

my $text = "Hello olleH";
$text =~ /olleH/g;
print $&,"\n","Pos: ".pos($text), "\n";
pos($text)=undef; # <-- Сбрасываем позицию
$text =~ /Hello/g;
print $&,"\n","Pos: ".pos($text), "\n";

Результат:

olleH
Pos: 11
Hello
Pos: 5
→ Ссылка