Проблема в том, что модификатор /g
не использует группы захвата для нескольких совпадений.Вам нужно либо перебрать совпадения в скалярном контексте, либо перехватить возвращенный список в контексте списка.Например:
use v5.10; # required for say()
$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";
while ($text =~ /\?([^.]+\.)/g) { # scalar context
say $1;
}
for ($text =~ /\?[^.]+\./g) { # list context
say; # match is held in $_
}
Обратите внимание, что во втором случае я пропустил парены, потому что в контексте списка возвращается полное совпадение, если паренов нет.Вы можете добавить парены, чтобы выбрать часть строки.
Ваша версия, используя if
, использует скалярный контекст, который сохраняет позицию самого последнего совпадения, но не продолжается.Чтобы увидеть, что происходит:
if($text =~ m/\?([^\.]+\.)/g) {
print "$1\n";
}
say "Rest of string: ", substr $text, pos;
pos
дает позицию самого последнего совпадения.