¿Cómo cambio esto a Perl "idiomático"?

Estoy empezando a profundizar en Perl, pero tengo problemas para escribir el código "Perl-ly" en lugar de escribir C en Perl. ¿Cómo puedo cambiar el siguiente código para usar más modismos de Perl y cómo debo aprender sobre los modismos?

Solo una explicación de lo que está haciendo: esta rutina es parte de un módulo que alinea el ADN o las secuencias de aminoácidos (usando Needelman-Wunch si te interesan esas cosas). Crea dos matrices 2d, una para almacenar una puntuación para cada posición en las dos secuencias, y otra para realizar un seguimiento de la ruta para que la alineación con la puntuación más alta se pueda recrear más adelante. Funciona bien, pero sé que no estoy haciendo las cosas de manera concisa y clara.

editar: Esto fue para una tarea. Lo completé, pero quiero limpiar un poco mi código. Los detalles sobre la implementación del algoritmo se pueden encontrar.en el sitio web de la clase Si alguno de ustedes está interesado.

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

Respuestas a la pregunta(6)

Su respuesta a la pregunta