كيف يمكنني تخزين مجموعة 2D وفي تجزئة في بيرل؟
-
05-07-2019 - |
سؤال
وأنا تكافح من خلال الكائنات في بيرل، وأحاول أن إنشاء مجموعة 2D و تخزينه في حقل التجزئة من وجوه بلدي. أنا أفهم أن لخلق مجموعة 2D وأنا بحاجة إلى مجموعة من الإشارات إلى المصفوفات، ولكن عندما أحاول القيام بذلك أحصل على هذا الخطأ: Type of arg 1 to push must be array (not hash element)
منشئ يعمل بشكل جيد، وset_seqs
يعمل بشكل جيد، ولكن لي create_matrix
الفرعية هو رمي هذه الأخطاء <. / P>
وهنا هو ما أقوم به:
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}, []);
}
}
وأي فكرة عما أقوم به خطأ؟
المحلول
وكنت في عداد المفقودين مجموعة إضافية من الأقواس عند dereference $ النفس. محاولة push @{$self->{matrix}}, []
.
وعندما تكون في شك (إذا كنت غير متأكد إذا كنت في اشارة الى القيمة الصحيحة في بنية بيانات معقدة)، إضافة المزيد من الأقواس. :) انظر perldoc perlreftut .
نصائح أخرى
وبيرل هو جدا م> التعبيرية أو اللغة. يمكنك أن تفعل ذلك مع كل بيان أدناه.
$self->{matrix} = [ map { [ (0) x $seq2 ] } 1..$seq1 ];
هل هذه لعبة غولف؟ ربما، ولكن أيضا م> يتجنب التلويث مع النموذج push
صعب. I تنفجر البيان التالي:
$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.
ولدي روتين القياسية لجعل الجداول:
sub make_matrix {
my ( $dim1, $dim2 ) = @_;
my @table = map { [ ( 0 ) x $dim2 ] } 1..$dim1;
return wantarray? @table : \@table;
}
وهنا وظيفة أكثر عمومية مجموعة من المصفوفات:
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 ];
}
}