How do I change this to “idiomatic” Perl?

前端 未结 6 2254
名媛妹妹
名媛妹妹 2021-02-09 03:46

I am beginning to delve deeper into Perl, but am having trouble writing \"Perl-ly\" code instead of writing C in Perl. How can I change the following code to use more Perl idiom

6条回答
  •  猫巷女王i
    2021-02-09 04:11

    I have some other comments as well, but here is the first observation:

    my $num_of_rows = length($self->{seq1}) + 1;
    my $num_of_columns = length($self->{seq2}) + 1;
    

    So $self->{seq1} and $self->{seq2} are strings and you keep accessing individual elements using substr. I would prefer to store them as arrays of characters:

    $self->{seq1} = [ split //, $seq1 ];
    

    Here is how I would have written it:

    sub create_matrix {
        my $self = shift;
    
        my $matrix      = $self->{score_matrix};
        my $path_matrix = $self->{path_matrix};
    
        my $rows = @{ $self->{seq1} };
        my $cols = @{ $self->{seq2} };
    
        for my $row (0 .. $rows) {
            $matrix->[$row]->[0] =  $row * $self->{gap_cost};
            $path_matrix->[$row]->[0] = 1;
        }
    
        my $gap_cost = $self->{gap_cost};
    
        $matrix->[0] = [ map { $_ * $gap_cost } 0 .. $cols ];
        $path_matrix->[0] = [ (-1) x ($cols + 1) ];
    
        $path_matrix->[0]->[0] = 2;
    
        for my $row (1 .. $rows) {
            for my $col (1 .. $cols) {
                my $gap1 = $matrix->[$row - 1]->[$col] + $gap_cost;
                my $gap2 = $matrix->[$row]->[$col - 1] + $gap_cost;
                my $match_mismatch =
                    $matrix->[$row - 1]->[$col - 1] +
                    $self->get_match_score(
                        $self->{seq1}->[$row - 1],
                        $self->{seq2}->[$col - 1]
                    );
    
                my $max = $matrix->[$row]->[$col] =
                    max($gap1, $gap2, $match_mismatch);
    
                $path_matrix->[$row]->[$col] = $max == $gap1
                        ? -1
                        : $max == $gap2
                        ? 1
                        : 0;
                }
            }
        }
    

提交回复
热议问题