Как мне изменить это на «идиоматический» Perl?

Я начинаю углубляться в Perl, но у меня проблемы с написанием "Perl-лы» код вместо написания C на Perl. Как я могу изменить следующий код, чтобы использовать больше идиом Perl, и как мне учиться идиомам?

Просто объяснение того, что он делает: эта процедура является частью модуля, который выравнивает последовательности ДНК или аминокислот (используя Needelman-Wunch, если вы заботитесь о таких вещах). Он создает два двумерных массива, один для хранения оценки для каждой позиции в двух последовательностях, а другой для отслеживания пути, чтобы выравнивание с наибольшим количеством баллов можно было воссоздать позже. Это работает нормально, но я знаю, что делаю вещи не очень кратко и четко.

редактировать: Это было для назначения. Я закончил, но хочу немного почистить мой код. Подробности реализации алгоритма можно найтина сайте класса если кто-то из вас заинтересован.

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;
            }
        }
    }
}