2016-10-20 6 views
1

Ich bin sehr neu in Perl und Programmierung im Allgemeinen. Ich habe in den letzten paar Tagen nach der Anzahl der Pattern Matches gesucht; Ich hatte es schwer, andere Lösungen zu verstehen und sie auf den Code anzuwenden, den ich bereits geschrieben habe.Zählen der Anzahl der Muster entspricht in Perl

Grundsätzlich habe ich eine Sequenz und ich brauche alle Muster zu finden, die passen [TC] C [CT] GGAAGC

Ich glaube, ich habe diesen Teil nach unten. aber ich bleibe beim Zählen der Anzahl der Vorkommen jeder Musterübereinstimmung. Kann jemand den Code bearbeiten, den ich bereits habe? Jeder Rat ist willkommen. Vielen Dank!

#!/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, ich habe in unten in dem Code

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

hinzugefügt. Es scheint jedoch vor jeder Musterübereinstimmung 0 auszugeben, anstatt die Gesamtsumme aller Musterübereinstimmungen auszugeben.

Edit: Ich brauche die Ausgabe, um jemals Muster Übereinstimmung gefunden zu finden. Ich brauche es auch, um die Gesamtzahl der gefundenen Übereinstimmungen zu finden. Zum Beispiel:

CCTGGAAGC

TCTGGAAGC

TCCGGAAGC

3 Spiele gefunden

+0

Bitte vandalisiere deinen eigenen Post nicht. – Dom

+1

Verfälschen Sie Ihre Fragen nicht –

Antwort

3

die Anzahl der Vorkommen jeder Mustererkennung Zählen

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

@matches Array enthält alle übereinstimmenden Teile. Sie können dann unten tun, um die Anzahl zu erhalten.

print scalar @matches 

Oder Sie direkt

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

Ich schlage vor, würden Sie die ersteren verwenden, wie Sie vielleicht müssen prüfen, „was wurde angepasst“ in Zukunft (vielleicht für das Debuggen?) Schreiben konnte.

Beispiel 1:

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

Beispiel 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

Ja, Sie haben Recht. Sie können es nun im skalaren Kontext verwenden, um die Anzahl zu erhalten, wie zum Beispiel 'print scalar @ matches'. Probieren Sie es aus und finden Sie es heraus. –

+0

Ich habe Beispiele in der Antwort hinzugefügt, um Ihre Zweifel zu beseitigen. Ich hoffe, das hilft. –

+0

Teilen Sie den Update-Code. Sie können Ihre Frage bearbeiten, um sie einzuschließen. –

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

Entschuldigung für Verzögerung Ergebnisse kommt mit guter Zählung. aber Problem mit unserer inneren While-Schleife entfernen Sie das bitte und versuchen Sie es. # while ($ seq = ~/([TC] C [CT] GGAAGC)/g) { # drucken $ 1, "\ n"; mein @matches = $ seq = ~/([TC] C [CT] GGAAGC)/g; skalare @matches drucken; #} – Magesh04

2

Wie Sie den Code geschrieben haben, müssen Sie die Spiele selbst zählen :

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"; 

sollte die Aufgabe erledigen.

HTH Georg

Verwandte Themen