Граф тандемных повторов в Perl - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь написать код, который дал эту строку:

"TTGCATCCCTAAAGGGATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCTCTCATCATCTTTGTGATCAA"

находит последовательные повторы (псевдоним тандемные повторы ) подстроки ATC, подсчитывает их и, если значение больше 10, выдает сообщение "Off"

Вот мой код:

my @count = ($content =~ /ATC+/g);
print @count . " Repeat length\n";

$nrRepeats = scalar(@count);    
if ($nrRepeats>10) {
    print("Off\n");
}
else {
    print("On\n");
}

Осложнения:
Он считает все подстроки ATC, присутствующие в строке, а не только тандемные повторы ATC.

Большое спасибо за помощь!

Ответы [ 4 ]

4 голосов
/ 07 июня 2019

Ваш вопрос немного двусмысленный.Я собираюсь ответить на каждую интерпретацию отдельно.

  1. Если вы пытаетесь определить, содержит ли строка более 10 АТС подряд, вы можете использовать

    if ($content =~ /ATCATCATCATCATCATCATCATCATCATCATC/)
    

    Это регулярное выражение можно записать более компактно:

    if ($content =~ /(?:ATC){11}/)
    
  2. Если вы пытаетесь подсчитать количество вхождений не менее 2 УВД в ряду, выможно использовать

    my $count = () = $content =~ /(?:ATC){2,}/g;
    if ($count > 10)
    

    (см. perldoc -q count.)

1 голос
/ 07 июня 2019

Perl - вполне язык программирования с поддержкой повторений, созданный для преодоления повторяющейся ручной работы.Таким образом, вы можете написать строки, которые повторяют шаблон как $pattern x $repetitions или буквально набирают 'ATC'x11.

Помимо сопоставления через /(?:ATC){11}/ (, как уже предлагалось ), это был бы другой способпросто получите Off :

print "Off\n" if $content =~ ("ATC" x 11);

Как сопоставить все тандемные повторы триггеров ATC и на тех, у кого более 10 повторений, [1] вам необходимо выполнить цикл по буквам:

while ($content =~ /(ATC(?:ATC)+)/g) {
    my $count = (length $1) / 3;
    print "$count repeat length\n";
    print "Off\n" if $count > 10;
}

В противном случае для таких входов, как $prefix.ATCx2.$infix.ATCx11.$postfix, обнаружение остановится при первом повторении тандема.Предварительно определенная ссылка на захваченное совпадение $1 используется для проверки длины совпадения.


[1] после подсчета появлений ATC вВсего, игнорируя, если они являются последовательными:

my $count = () = $content =~ /ATC/g;
print "count (total matches) $count\n";
1 голос
/ 07 июня 2019

Ваше регулярное выражение /ATC+/g ищет AT, за которым следует один или несколько C Я подозреваю, что вам нужно это

/(ATC(?:ATC)+)/g

Что такое УВД, за которым следует один или несколько УВД

0 голосов
/ 07 июня 2019
#!/usr/bin/env perl
use strict;
use warnings;
# The string with the text to match
my $content = "TTGCATCCCTAAAGGGATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCTTTGTGATCAA";
# Split the text in every point preceded or followed by ATC
my @array = split /(?:(?<=ATC)|(?=ATC))/, $content;
# Creates an array which first element is 0 to contain every number of consecutives matches of ATC
my @count = 0;
for (@array) {
    if (/^ATC$/) {
# If ATC matches $_ increment by one the number of matches
        $count[-1]++;
    } else {
# If not and the script is counting a previous ATC sequence 
# we reset the counter adding a new element
        $count[-1] != 0 and push @count, 0;
    }
}
# Initialices $max and $index to 0 and undef respectively
my ($max,$index) = (0, undef);
for (keys @count) {
# If $max has less value than the current iterated sequence 
# $max is updated to current value and so is $index
    $max < $count[$_] and ($max, $index) = ($count[$_], $_);
}
# $index won't be defined if no value of ATC exists
defined $index and print "$max Repeat length\n";
# prints Off is the max match is greater or equal than 10
print(($max>=10?'Off':'On')."\n");

Я думаю, что это хороший способ, поскольку он позволяет узнать больше данных, например, сколько раз повторяется.

РЕДАКТИРОВАТЬ: Обновлено с комментариями.

...