The trick with the alternation is that your regex matches -s delimited by B's, thus slurping them up. The next regex search starts off after the last B, and needs to skip the following -s to find the next B.
use 5.010;
use strict;
use warnings;
$_ = '------BBBBB-----------------------------------------------------
+-------------------------------------------------------BBBBBB----BBBB
+BBBB-----------------BBBBBB------------------------------------------
+--------------BBBBBBB---------------BBBBB-----BBBBBBBBB--------------
+----------------------BBBBBBBBB------BBBBBBBBB-----------------------
+-----BBBBBBBBB--------------------------------------BBBBBBBB-------BB
+BBBB---------------------BBBBBBB--------------------------BBBBBBBB---
+-';
my $expected = 'iiiiiiMMMMMooooooooooooooooooooooooooooooooooooooooooo
+oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooMMMM
+MMiiiiMMMMMMMMoooooooooooooooooMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+iiiiiiiiiiiiiiiiiiiiiiiiMMMMMMMoooooooooooooooMMMMMiiiiiMMMMMMMMMoooo
+ooooooooooooooooooooooooooooooooMMMMMMMMMiiiiiiMMMMMMMMMooooooooooooo
+oooooooooooooooMMMMMMMMMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMMMMMMM
+MoooooooMMMMMMiiiiiiiiiiiiiiiiiiiiiMMMMMMMooooooooooooooooooooooooooM
+MMMMMMMiiii';
s/(^|B+)(-+)($|B+)/ $1 . ("i" x length($2)) . $3/eg;
s/-/o/g;
s/B/M/g;
say $expected;
say $_;
say $expected eq $_ ? 'yes' : 'no';