2016-10-20 4 views
1

Я ОЧЕНЬ новичок в perl, а также в программировании в целом. Я искал последние пару дней, как подсчитать количество совпадений шаблонов; Мне было трудно понять другие решения и применить их к коду, который я уже написал.Подсчет числа совпадений шаблонов в Perl

В принципе, у меня есть последовательность, и мне нужно найти все модели, которые соответствуют [TC] C [CT] GGAAGC

Я считаю, что я эту часть вниз. но я застрял на подсчете количества вхождений каждого совпадения шаблонов. Кто-нибудь знает, как отредактировать код, который я уже должен сделать? Любые советы приветствуются. Благодаря!

#!/usr/bin/perl 
use strict; 
use warnings; 
use diagnostics; 

# open fasta file for reading 
unless(open(FASTA, "<", '/scratch/Drosophila/dmel-all-chromosome- r6.02.fasta')) { 
    die "Can't open dmel-all-chromosome-r6.02.fasta for reading:", $!; 
} 

#split the fasta record 
local $/ = ">"; 

#scan through fasta file 
while (<FASTA>) { 
    chomp; 
    if ($_ =~ /^(.*?)$(.*)$/ms) { 
      my $header = $1; 
      my $seq = $2; 
      $seq =~ s/\R//g; # \R removes line breaks 
        while ($seq =~ /([TC]C[CT]GGAAGC)/g) { 
          print $1, "\n"; 
      } 
    } 
} 

Update, я добавил в

my @matches = $seq =~ /([TC]C[CT]GGAAGC)/g; 
          print scalar @matches; 

В приведенном ниже коде. Однако, похоже, он выводит 0 перед каждым совпадением шаблонов, вместо вывода общей суммы всех совпадений шаблонов.

while (<FASTA>) { 
    chomp; 
    if ($_ =~ /^(.*?)$(.*)$/ms) { 
      my $header = $1; 
      my $seq = $2; 
      $seq =~ s/\R//g; # \R removes line breaks 
        while ($seq =~ /([TC]C[CT]GGAAGC)/g) { 
          print $1, "\n"; 
          my @matches = $seq =~ /([TC]C[CT]GGAAGC)/g; 
          print scalar @matches; 
    } 
    } 
} 

Редактировать: Мне нужен вывод для отображения списка совпадений. Мне также нужно найти общее количество найденных совпадений. Например:

CCTGGAAGC

TCTGGAAGC

TCCGGAAGC

3 соответствует найдено

+0

Пожалуйста, не отрицайте свое собственное сообщение. – Dom

+1

Не отрицайте свои вопросы –

ответ

3

подсчета количества вхождений каждого шаблона матча

my @matches = $string =~ /pattern/g 

@matches массив будет содержать все согласованные детали. Затем вы можете сделать снимок, чтобы получить счет.

print scalar @matches 

Или вы могли бы написать непосредственно

my $matches =() = $string =~ /pattern/ 

Я хотел бы предложить вам использовать бывший, как вы, возможно, потребуется проверить «что соответствует» в будущем (возможно, для отладки?).

Пример 1:

use strict; 
use warnings; 
my $string = 'John Doe John Done'; 
my $matches =() = $string =~ /John/g; 
print $matches; #prints 2 

Пример 2:

use strict; 
use warnings; 
my $string = 'John Doe John Done'; 
my @matches = $string =~ /John/g; 
print "@matches"; #prints John John 
print scalar @matches; #prints 2 

Edit:

while (my @matches = $seq =~ /([TC]C[CT]GGAAGC)/g) { 
    print $1, "\n"; 
    print "Count of matches:". scalar @matches; 
} 
+0

Да, вы правы. Теперь вы можете использовать его в скалярном контексте, чтобы получить счетчик, например 'print scalar @ matches'. Попробуйте и узнайте. –

+0

Я добавил примеры в ответ, чтобы устранить ваши сомнения. Надеюсь, это поможет. –

+0

Поделитесь обновленным кодом. Вы можете изменить свой вопрос, чтобы включить это. –

1
my @count = ($seq =~ /([TC]C[CT]GGAAGC)/g); 
print scalar @count ; 
+0

Извините, что результаты задержки выдаются с хорошим счетом. , но проблема с нашим внутренним циклом, пожалуйста, удалите это и попробуйте. # while ($ seq = ~/([TC] C [CT] GGAAGC)/g) { # print $ 1, "\ n"; my @matches = $ seq = ~/([TC] C [CT] GGAAGC)/g; print scalar @matches; #} – Magesh04

2

Как вы написали код, вы должны рассчитывать на матчи самостоятельно :

local $/ = ">"; 
my $count = 0; 

#scan through fasta file 
while (<FASTA>) { 
    chomp; 
    if ($_ =~ /^(.*?)$(.*)$/ms) { 
      my $header = $1; 
      my $seq = $2; 
      $seq =~ s/\R//g; # \R removes line breaks 
        while ($seq =~ /([TC]C[CT]GGAAGC)/g) { 
          print $1, "\n"; 
          $count = $count +1; 
      } 
    } 
} 
print "Fount $count matches\n"; 

должен выполнить эту работу.

HTH Georg