Question

Je lutte à travers des objets en Perl et j'essaie de créer un tableau 2D et de le stocker dans un champ de hachage de mon objet. Je comprends que pour créer un tableau 2d, j'ai besoin d'un tableau de références à des tableaux, mais lorsque j'essaie de le faire, j'obtiens cette erreur: Le type d'arg 1 à pousser doit être un tableau (pas d'élément de hachage) Le constructeur fonctionne correctement et set_seqs fonctionne correctement, mais mon sous- create_matrix génère ces erreurs.

Voici ce que je fais:

sub new {
    my ($class) = @_;
    my $self = {};
    $self->{seq1} = undef;
    $self->{seq2} = undef;
    $self->{matrix} = ();
    bless($self, $class);
    return $self;
}
sub set_seqs {
    my $self = shift;
    $self->{seq1} = shift;
    $self->{seq2} = shift;
    print $self->{seq1};
}

sub create_matrix {
    my $self = shift;
    $self->set_seqs(shift, shift);
    #create the 2d array of scores
    #to create a matrix:
    #create a 2d array of length [lengthofseq1][lengthofseq2]
    for (my $i = 0; $i < length($self->{seq1}) - 1; $i++) {
        #push a new array reference onto the matrix
        #this line generates the error
        push(@$self->{matrix}, []);
    }
}

Avez-vous une idée de ce que je fais mal?

Était-ce utile?

La solution

Il vous manque un jeu supplémentaire d'accolades lorsque vous déréférencez $ self. Essayez push @ {$ self- > {matrix}}, [] .

En cas de doute (si vous n'êtes pas sûr de faire référence à la valeur correcte dans une structure de données complexe), ajoutez plus d'accolades. :) Voir perldoc perlreftut .

Autres conseils

Perl est un langage très expressif très . Vous pouvez faire tout cela avec la déclaration ci-dessous.

$self->{matrix} = [ map { [ (0) x $seq2 ] } 1..$seq1 ];

Est-ce que ce golf? Peut-être, mais cela évite également d’éviter de falsifier le prototype pointilleux de push . J'éclate la déclaration ci-dessous:

$self->{matrix} = [     # we want an array reference
    map {               # create a derivative list from the list you will pass it
        [ (0) x $seq2 ] # another array reference, using the *repeat* operator 
                        # in it's list form, thus creating a list of 0's as 
                        # long as the value given by $seq2, to fill out the  
                        # reference's values.
   } 
   1..$seq1             # we're not using the indexes as anything more than  
                        # control, so, use them base-1.
];                       # a completed array of arrays.

J'ai un sous-programme standard pour créer des tableaux:

sub make_matrix { 
    my ( $dim1, $dim2 ) = @_;
    my @table = map { [ ( 0 ) x $dim2 ] } 1..$dim1;
    return wantarray? @table : \@table;
}

Et voici une fonction plus généralisée de tableau de tableaux:

sub multidimensional_array { 
    my $dim = shift;
    return [ ( 0 ) x $dim ] unless @_; # edge case

    my @table = map { scalar multidimensional_array( @_ ) } 1..$dim;
    return wantarray ? @table : \@table;
}
sub create_matrix {
    my($self,$seq1,$seq2) = @_;
    $self->set_seqs($seq2, $seq2);

    #create the 2d array of scores
    #to create a matrix:
    #create a 2d array of length [$seq1][$seq2]
    for( 1..$seq1 ){
        push @{$self->{matrix}}, [ (undef) x $seq2 ];
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top