1

私は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";
            }
    }
}

更新、追加しました

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 件の一致が見つかりました

4

3 に答える 3

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

編集:

while ( my @matches = $seq  =~ /([TC]C[CT]GGAAGC)/g) {
    print $1, "\n";
    print "Count of matches:". scalar @matches;
}
于 2016-10-20T13:07:52.253 に答える
1
my @count = ($seq  =~ /([TC]C[CT]GGAAGC)/g);
print scalar @count ;
于 2016-10-20T13:12:35.227 に答える