Forum Moderators: coopster & phranque

Message Too Old, No Replies

'grouping' matches?

         

ktsirig

3:52 pm on Feb 1, 2006 (gmt 0)

10+ Year Member



Hi all!

I have a string :

$seq="IIIIIMMMMMMMMMMMOOOOOOOOOOOOOOOOMMMMMMMMMMMMMIIIIIMMMMMMMMMOOOOOOOOOOOOOOMMMMMMMMMMMMMIIIMMMMMMMMMMMOOOOOOOOOOOOOOOMMMMMMMMMMMIIIIIIMMMMMMMMMMMMMOOOOOOOOOOOOOOOOOOOOOOOMMMMMMMIIIMMMMMMMMMOOOOOOOOOOOOOOOOOOOOOOOOOOOMMMMMMMIIIIMMMMMMMMMMMOOOOOOOOOOOOOOOOOOOOOMMMMMMMIIIMMMMMMMMMOOOOOOOOOOOOOOOOOOOOOOOOOMMMMMMMMMIIIMMMMMMMMMMMOOOOOOOOOOOOOOOOOMMMMMMMMI";

and I want to find all groups of MMMMMM. I don't want to find only every position in the string that has 'M',
i.e. pos6, pos7, pos8, pos9 etc but I want to have something like:

1st group : pos 7-15
2nd group : pos 23-34
3rd group : pos 45-55

etc

perl_diver

10:45 pm on Feb 1, 2006 (gmt 0)

10+ Year Member



one very straight forward method could be:


my $seq = 'IIIIIMMMMMMMMMMMOOOO.....OOOOOOOOOOOOMMMMMMMMI';
my @seq = split(//,$seq);
my $flag = 0;
my $start = 0;
my $end = 0;
my $group = 0;
for my $i (0..$#seq) {
if ($seq[$i] eq 'M' && $flag == 0) { ($flag,$start) = (1,$i+1) }
if ($seq[$i] ne 'M' && $flag == 1) { ($flag,$end) = (0,$i) }
if ($end > $start) {
$group++;
push @results, "Group $group : pos $start-$end";
($start,$end) = (0,0);
}
}
print "$_<br />" for @results;

where 'IIIIIMMMMMMMMMMMOOOO.....OOOOOOOOOOOOMMMMMMMMI' is the full string you posted

perl_diver

11:51 pm on Feb 1, 2006 (gmt 0)

10+ Year Member



Note: I assumed the first character in the string is one instead of zero which is why I add one to $i to get the start positions.