Нахождение границ подстрок - PullRequest
0 голосов
/ 28 сентября 2010

У меня есть строка, содержащая несколько подстрок, каждая из которых содержит один или несколько символов 'E'. Я пытаюсь получить координаты каждой из этих строк, используя Perl и регулярные выражения. Вот что я попробовал сначала.

#!/usr/bin/perl
use strict;

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG";
foreach my $match($str =~ m/(E+)/)
{
  print "match: $match, coords: (". $-[0] .", ". $+[0] .")\n";
}

Вывод на терминал выглядит следующим образом ...

> ./test
match: EE, coords: (5, 7)

, поэтому он успешно находит первую подстроку. Но я хотел бы определить каждую подстроку. Поэтому я добавил модификатор 'g' в регулярное выражение, например ...

#!/usr/bin/perl
use strict;

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG";
foreach my $match($str =~ m/(E+)/g)
{
  print "match: $match, coords: (". $-[0] .", ". $+[0] .")\n";
}

, который дает следующий вывод терминала.

> ./test
match: EE, coords: (20, 21)
match: E, coords: (20, 21)
match: EEE, coords: (20, 21)
match: E, coords: (20, 21)

Как видите, он правильно находит каждую подстроку, но я только вытаскиваю координаты последнего совпадения. Может я неправильно использую $ - и $ +? Любые идеи, как я могу получить эти координаты правильно? Спасибо.

1 Ответ

5 голосов
/ 28 сентября 2010

foreach сначала строит список совпадений, а , а затем перебирает их.В этот момент @- и @+ содержат только данные последнего совпадения.Попробуйте:

#!/usr/bin/perl
use strict;

my $str = "GGGFFEEIIEIIIIEEEIIIETTGGG";
while ($str =~ m/(E+)/g)
{
  printf "match: %s, coords: (%d, %d)\n", $1, $-[0], $+[0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...