Meine Frage (n) bezieht sich auf das Arbeiten mit Inline-C-Code: ist es notwendig, die Inline-Stack-Funktionen (Inline_Stack_Vars) zu verwenden rein und raus, oder ist es in diesem Kontext sinnvoll, nur eine Variable zu verändern?Perl Inline :: C: Sind Inline_Stack_Vars etc. notwendig, um Speicherlecks zu vermeiden (Biosequenz-Zeichenabgleich)
Für die Anzeige von Biosequenz-Daten, muss ich nur Unterschiede zwischen zwei ausgerichteten Strings zeigen; z.B. gegeben diese beiden Strings:..
ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
--CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA--
ich diese (die passenden Zeichen in der zweiten Saite mit‘ersetzt bekommen die
--.CCC..CT....G...G..........-............---...--
Ich habe eine Menge von Sequenzen (Millionen von Illumina liest) wird so gedreht für den Charakter passenden Inline :: c der folgende inlined Code ganz gut zu funktionieren scheint (das zweite Argument die add_matchchars Funktion anstelle Wechsel).
#!/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);
}
Aber 1) i t einigermaßen effizient (gibt es einen klüger/besseren Weg)? und 2) wird es Speicher verlieren?
'Inline_Stack_ *' ist ein Mittel zum Zugriff auf Variablenlängenlisten. Hat nichts mit Speicherlecks zu tun. – ikegami
Die Inline_Stack _.... sind Makros, die anstelle von Makros der unteren Ebene verwendet werden können, die normalerweise beim Übergeben von Parametern verwendet werden Mit dem Perl XS können Sie auf dem Aufruf-Stack hin und her schalten. Das ist bequem: Wenn Sie auf den Parameter-Aufruf-Stack zugreifen, verwenden Sie entweder diese Makros oder die Untere Ebene XS Makromenge. – DavidO