私の質問は、インライン 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)メモリリークしますか?