Le mie domande riguardano il funzionamento del codice C in linea: è necessario utilizzare le funzioni di stack inline (Inline_Stack_Vars) per passare le variabili dentro e fuori, o è appropriato in questo contesto modificare semplicemente una variabile?Perl Inline :: C: Are Inline_Stack_Vars ecc. Necessari per evitare perdite di memoria (corrispondenza dei caratteri di biosequenza)
Per la visualizzazione di dati di biosequenza, devo mostrare solo le differenze tra due stringhe allineate; per esempio. Alla luce di questi due stringhe:..
ATCAGAAA--GACATGGGCCAAAGATTAA-CAGTGGCCATTGACAGGA--
--CCCCAACTGACAGGGGGCAAAGATTAA-CAGTGGCCATTG---GGA--
voglio ottenere questo (i caratteri corrispondenti nella seconda stringa sostituito con' di
--.CCC..CT....G...G..........-............---...--
ho un sacco di sequenze (milioni di Illumina legge), così si sono rivolti a inline :: c per l'abbinamento dei caratteri il codice inline seguente sembra funzionare bene (modificando il secondo argomento della funzione add_matchchars sul posto):.
#!/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);
}
Ma 1) è i t ragionevolmente efficiente (c'è un modo più intelligente/migliore)? e 2) riuscirà a perdere memoria?
'Inline_Stack_ *' è un mezzo per accedere agli elenchi di argomenti di lunghezza variabile.Non ha nulla a che fare con perdite di memoria. – ikegami
Inline_Stack _.... sono macro che possono essere utilizzate al posto di macro di livello inferiore normalmente utilizzate durante il passaggio di parametri avanti e indietro sullo stack di chiamate usando Perl XS. Sono utili. Se si accede allo stack di chiamata dei parametri, in genere si utilizzano questi macro o macro di livello inferiore XS. – DavidO