-1

substr 関数を使用して、シーケンス内のいくつかのヌクレオチドを回復したいと考えています。ここに、これらのシーケンスの FASTA 形式があります。

>dvex28051
AAAACAAAAACATTCGCTAGAAAGTAATCAGCTGGTCATTTATTTGAAATGTTAATGATATATTTCATGTTGCTAATTTTTTATGAAAAAAATCATTGCTTATTTAATTACTCTTGGTTCTTGACCAACTATAAAAGCATTGTTTAGTATCAAGTGTCCAGGTATCAGCAGTTTTGTTTGAAAACAAACTTTTATTCATGCAGTCAGTGGCGGATCCAGGTAGAGTGCAGAGGCAGCACCCTCCGTCAGAAAACCAAAAAAAGAAGAAATGAAAAATTATAAAAAAAATTTCTAAACGTTGGTGCACTTAAGTGTAGCAAAAAATTCCTGTTTAGATATTCAGTGGGGAGCGACACCTTTTGGGGCCTATAGCTTCAAATCTTACTTGGTGACCTAAAATCGCTTTTTCGTTGGATCTGCGAAAGCTAGAATTTGGTTGCTGCAAATCGAATCGGTGCATCAACTGCATCAATATCAACGATGTGGTGACTGGTGGTATATTTTGGGTTCGTGCAATGCTACATTTATTTCAATCATATTTCAAGGCAGAAAGGGAAAGAAAACATCAGGTCAAGACAGTGGCGTAGCGAGGGAAGGGGGGCATACGTCCCCGGGCGCAACACGATGTCTTTTTTTTTAATCATCTGCGAAATTCAGACATTTTTTAGAGACTAAATGAAACTATGGAAAACCGGGCCCTTATAAAAGTTGAGACCAAGTGAAAAACTGGGGATAAAACATGAAAATCGGGCTCCAAAAGAATGAGAGTCCGCCCTTGGTCTGTACCAGCATGATTTGAGCGCAAATTTCATTAAGCCCCCGGGCGCAAGACACTCACGCTACGCCCCTGGGTAAAGACAAACAGAGTAGTTTTTCTTATAAACACAAGCATGCACAAACAACATAAAAACAAAACACAGTTTTTTTTAAGACGATGTGCTGCGTGCACCCGCTCAATGTTTTTTTTTTTTTTTTATAGAAAAGCAAAACTTTGAAAGGTTAACGTCAACTCATTTTACAACAATTTGTGGCAAATGGTATCAAGGTATCAAGCAATTAACTAAATGTCTTCCACTAGAACGCAGAACACCATTTTGCAATTATTTATTTGATGTAAACCAGTGTGTTAGATCAAAATCACTTCGACGCCGTTTTTTGACTCCGTGAAAATCTTGGTATTCTTCTCGCATTGCATAATGATGGTTTGTTGAAATAAAATTAAACGCTTAACGTTCTTAAAATGAGCGCGATACTACTTTTCTTTGTAGATTTTCTGCATGCGCTCCTTTTAAGTTGATCCCGAGCTACAAACTTCTTTATGAACGTTTTGGATTTCTCCAAAATAAAGCCTGCAAGCAGTTTTCTAAAAACACCGCACCCCCCATTAGGAATTTCTAGATCCGCCCCTGCATACAGTATTTGTTAATTATTAAAACCAACCAGCAGCAATTGTTTATTCAATGACTATTAAACCAACCTGGATAGTGCGTTTGGTCTTGATTGAAGCGATTGCTGCATTGACGTCTTTCGGAACCACATCACC
>dvex294195
GAATCAGTGGAAAAGTCACAACGCAGCTTGCCGAATTACTGCAGATTCTTTACACTTTTTTTTCTACATTATCACTGTTTTGCTTAATTTTCAATTATAGAAATCAAAATTAATAACTGGTATGTAGTTGGTCGGTGCTTCGAGAAAGTAGCCTACTCAATGATTTCTCAGAATGTTACAGTACTTCAAAAAAACAGACTACCCATTTCAAAAAATATAAACCTAGTA

ハッシュの各キーをこのテーブルのヒット列 (dvex\d++) と比較したい:

#Query Hit  sense start end star_q end_q lenght_q # this line is informative don't make part of the code.
miRNA1 dvex28051 +  205     232     11  38  51
miRNA1 dvex202016 -  75    106  17  48  51
miRNA1 dvex294195 +  55     85     11  48  51

これが存在する場合、substr 関数を適用するために、ハッシュの値を変数 (例: $sequence) に割り当てます。 my $fragment = substr $sequence, $start, $length_sequence;

シーケンスを使用して配列を作成し、2 つの値ごとに読み取って比較しようとしました。

while (my $line1 = <$MYINPUTFILE>){ #Entry of the sequences Fasta file
chomp $line1;
push @array_lines, $line1;
}
while (my $line2 = <$IN>){ #Entry of the table
chomp $line2;
push @database_lines, $line2;
}   
foreach my $database_line (@database_lines){ #each value of the table
my @entry = split /\s++/,$database_line;
$pattern = $entry[1];
$query = $entry[0];
$start = $entry[3];
$l_pattern = length $pattern;
$end = $entry[4];
$lng_sequence = ($end - $start) + 1;
$sense = $entry[2];
$l_query = $entry[7];

my $count = 2;
for (my $i = 0; $i <= $#array_lines; $i +=$count){
    chomp $array_lines[$i-2];
    chomp $array_lines[$i-1];   
    $seq = $array_lines[$i-1];
    $header = $array_lines[$i-2];
if($new_header =~ /$pattern/ && $l_header == $l_pattern){
    if(($end+$right_diff+$increment) > $l_query){
        $clean_seq = substr $seq, $start, $l_query;
} else {;} 
}

私のコードの問題は、Perl が $seq を最後の Sequence として認識することです。そして、常にこの $seq に substr 関数を適用します。$pattern を検索し、それらのシーケンスを検索する必要があります。存在する場合は、$seq をそのシーケンスに割り当て、次に substr 関数を適用します。いくつかの提案?

4

1 に答える 1

1

コードに2つの重大な問題があります。まず、ループ内:

for (my $i = 0; $i <= $#array_lines; $i +=$count){
    chomp $array_lines[$i-2];
    chomp $array_lines[$i-1];   
    $seq = $array_lines[$i-1];

$iは最初からゼロに設定されますが、配列要素$i-1とにアクセスします$i-2。要素-1は配列の最後の要素になり、最後-2から2番目の要素になります。そのため、ループの最初の段階では、値が正しくないよう$seqに見えます。$header多分あなたはゼロの代わりに始める必要があり$iます$countか?

第二に、この行で:

if(($end+$right_diff+$increment) > $l_query){

$incrementここにのみコードに表示されます。何にも設定されません。$iここで使うつもりでしたか?

他のいくつかの提案:

これにより、上記の変数use warnings; use strict;などのエラーがキャッチされます。$increment

ファイルを配列に読み込む簡単な方法は次のとおりです。

my @array_lines = <$MYINPUTFILE>;
chomp @array_lines;

正規表現内に++は、バックトラッキングを無効にする特別な数量詞があります。1つ以上の空白文字で分割する場合は、、split /\s+/または同等の文字を使用するのが一般的です。split ' '

この行では、2つの文字列が等しいことを単にチェックしているように見えます。

if($new_header =~ /$pattern/ && $l_header == $l_pattern)

代わりにこれを行うことができます:

if($new_header eq $pattern)

if複数の条件がある場合は、ネストされたステートメントを使用するのではなく、それらすべてを1つのステートメントにまとめる方が明確です。条件が多い場合は、わかりやすくするために複数行に並べることができます。

使用する必要はelse {;} ありません。そこで何もする必要がない場合は、else句を完全に省略してください。

于 2013-02-27T09:10:36.660 に答える