Je commence à approfondir Perl, mais j'ai du mal à écrire du code "Perl-ly" au lieu d'écrire C en Perl. Comment puis-je changer le code suivant pour utiliser plus d'idiomes Perl, et comment devrais-je apprendre les idiomes?Comment changer cela en "idiomatique" Perl?
Juste une explication de ce qu'il fait: Cette routine fait partie d'un module qui aligne des séquences d'acides aminés ou d'ADN (en utilisant Needelman-Wunch si vous vous souciez de telles choses). Il crée deux tableaux 2d, un pour stocker un score pour chaque position dans les deux séquences, et un pour garder une trace du chemin afin que l'alignement le plus haut score puisse être recréé plus tard. Cela fonctionne bien, mais je sais que je ne fais pas les choses de façon très concise et claire.
modifier: Ce fut pour une mission. Je l'ai terminé, mais je veux un peu nettoyer mon code. Les détails sur la mise en œuvre de l'algorithme peuvent être trouvés on the class website si l'un de vous êtes intéressé.
sub create_matrix {
my $self = shift;
#empty array reference
my $matrix = $self->{score_matrix};
#empty array ref
my $path_matrix = $self->{path_matrix};
#$seq1 and $seq2 are strings set previously
my $num_of_rows = length($self->{seq1}) + 1;
my $num_of_columns = length($self->{seq2}) + 1;
#create the 2d array of scores
for (my $i = 0; $i < $num_of_rows; $i++) {
push(@$matrix, []);
push(@$path_matrix, []);
$$matrix[$i][0] = $i * $self->{gap_cost};
$$path_matrix[$i][0] = 1;
}
#fill out the first row
for (my $i = 0; $i < $num_of_columns; $i++) {
$$matrix[0][$i] = $i * $self->{gap_cost};
$$path_matrix[0][$i] = -1;
}
#flag to signal end of traceback
$$path_matrix[0][0] = 2;
#double for loop to fill out each row
for (my $row = 1; $row < $num_of_rows; $row++) {
for (my $column = 1; $column < $num_of_columns; $column++) {
my $seq1_gap = $$matrix[$row-1][$column] + $self->{gap_cost};
my $seq2_gap = $$matrix[$row][$column-1] + $self->{gap_cost};
my $match_mismatch = $$matrix[$row-1][$column-1] + $self->get_match_score(substr($self->{seq1}, $row-1, 1), substr($self->{seq2}, $column-1, 1));
$$matrix[$row][$column] = max($seq1_gap, $seq2_gap, $match_mismatch);
#set the path matrix
#if it was a gap in seq1, -1, if was a (mis)match 0 if was a gap in seq2 1
if ($$matrix[$row][$column] == $seq1_gap) {
$$path_matrix[$row][$column] = -1;
}
elsif ($$matrix[$row][$column] == $match_mismatch) {
$$path_matrix[$row][$column] = 0;
}
elsif ($$matrix[$row][$column] == $seq2_gap) {
$$path_matrix[$row][$column] = 1;
}
}
}
}
Pourquoi ai-je lu ce la première fois que – jsight
Merci d'avoir mentionné le nom de l'algorithme! Je m'amuse à lire à ce sujet (et d'où viennent les matrices de score, et l'alignement des séquences en général, et ...) – Cascabel
Oui, la bio-informatique a derrière elle un fascinant CS. Je suis en train d'apprendre tout sur les arbres de suffixe en ce moment, qui sont parfaits pour la cartographie de petites séquences à un emplacement dans un génome de 3 milliards + bases. – jergason