Это:
for (my $pos = 0..length($dna))
{
my $base = substr($dna, $pos, 1);
, вероятно, вместо этого будет 0..length($dna)-1
?
Когда $ pos - длина, подстрока будет пустой строкой.
И это неправильный синтаксис цикла for для итерации по диапазону.Это должно быть
for my $pos (0..length($dna)-1)
Это:
if ($pos = $ms..($ms + $width))
, если я правильно понимаю, должно быть
if ($pos >= $ms && $pos < $ms + $width)
То, что у вас есть, присваивает $ pos результатоперация триггера, которая не будет ничего полезного.
Это выглядит так:
my $ms = int(rand(((length($dna)+1)-$width)));
должно быть
my $ms = int(rand(((length($dna))-$width)));
Например, если длина $ dna равна10 и width = 3, вы хотите, чтобы возможные начальные смещения были от 0 до 7, а не от 0 до 8.
И похоже, что ваш подсчет в мотиве должен использовать позицию внутри мотива, а не $ pos;это:
$motA[$pos] = $motA[$pos] + 1;
должно быть
$motA[$pos-$ms] = $motA[$pos-$ms] + 1;