7

私の質問は、インライン C コードの作業に関するものです。インライン スタック関数 (Inline_Stack_Vars) を使用して変数を出し入れする必要がありますか、それとも、このコンテキストでは変数をその場で変更するだけで適切ですか?

生物配列データを表示するには、整列された 2 つの文字列の違いだけを表示する必要があります。たとえば、次の 2 つの文字列が与えられた場合:

    ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
    --CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA--

これを取得したい (2 番目の文字列の一致する文字が「.」に置き換えられた)。

    --.CCC..CT....G...G..........-............---...--

私はたくさんのシーケンス (何百万ものイルミナ読み取り) を持っているので、文字マッチングのために inline::c に変わりました。次のインライン コードは問題なく動作するようです (2 番目の引数を add_matchchars 関数に変更します)。

#!/usr/bin/perl
use Inline C;

my($seq1,$seq2) = qw/ ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
                      --CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA-- /;

print $seq1,"\n";
print $seq2,"\n";
add_matchchars($seq1,$seq2);
print $seq2,"\n";

__END__

__C__

void add_matchchars(char *seq1, char *seq2) {
    int seq1char;
    int seq2char;
    while(seq1char = *seq1++ , seq2char = *seq2++) {
        if (seq1char == seq2char) {
            *seq2--;
            if (seq1char != '-') {
                *seq2 = '.';
            }
            *seq2++;
        }
        //printf("%c-%c\n",seq1char,seq2char);
    } 
 // printf("%s\n%s\n",seq1,seq2);
}

しかし、1)それは合理的に効率的ですか (より賢い/より良い方法はありますか)? 2)メモリリークしますか?

4

1 に答える 1