Странное поведение 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 шт):
Модификатор регулярных выражений 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