Benchmarked a few solutions:
use Benchmark qw(:all);
my $str = 'iiiiiiiiMMMMMMMMMMMooooooooooooMMMMMMMMMMiiiiiMMMMMMMMoooo'
+;
my $these = {
'count' => sub {
my $count = 0;
$count++ while $str =~ /(M+)/g;
$count;
},
'regex' => sub {
my $count = () = $str =~ /(M+)/g;
},
'split' => sub {
$#{[split /M+/, $str, -1]};
},
};
printf "%-10s %d\n", $_, $these->{$_}->() for sort keys %$these;
print "\n";
cmpthese(-1, $these);
Got these:
count 3
regex 3
split 3
Rate split regex count
split 335814/s -- -3% -30%
regex 345739/s 3% -- -27%
count 476625/s 42% 38% --