私は Perl を深く掘り下げ始めていますが、Perl で C を書く代わりに「Perl 風」のコードを書くのに苦労しています。次のコードを変更して、より多くの Perl イディオムを使用するにはどうすればよいですか? また、イディオムを学習するにはどうすればよいですか?
それが何をしているかの簡単な説明: このルーチンは、DNA またはアミノ酸配列を整列させるモジュールの一部です (そのようなことに関心がある場合は、Needelman-Wunch を使用してください)。2 つの 2 次元配列を作成します。1 つは 2 つのシーケンスの各位置のスコアを格納するためのもので、もう 1 つはパスを追跡するためのもので、後で最高スコアのアライメントを再作成できるようにします。それはうまくいきますが、私は物事を非常に簡潔かつ明確に行っていないことを知っています.
編集:これは割り当て用でした。完了しましたが、コードを少し整理したいと思います。アルゴリズムの実装に関する詳細は、興味のある方はクラスの Web サイトで見つけることができます。
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;
}
}
}
}