代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

如何在Perl的散列中存储二维数组?

  •  1
  • Jamison Dance  · 技术社区  · 15 年前

    我正在努力研究Perl中的对象,并试图创建一个二维数组,并将其存储在对象的散列字段中。我知道要创建一个二维数组,我需要一个对数组的引用数组,但是当我尝试创建它时,我会得到这个错误: Type of arg 1 to push must be array (not hash element) 施工人员工作良好,并且 set_seqs 很好,但是我的 create_matrix Sub正在抛出这些错误。

    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}, []);
        }
    }
    

    知道我做错了什么吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Ether    15 年前

    当您取消对$self的引用时,缺少一组额外的大括号。尝试 push @{$self->{matrix}}, [] .

    如果有疑问(如果您不确定是否在复杂的数据结构中引用了正确的值),请添加更多的大括号。):看 perldoc perlreftut .

        2
  •  3
  •   Axeman maxelost    15 年前

    Perl是 非常 富有表现力的语言。您可以通过下面的语句来完成这一切。

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

    这是高尔夫球吗?也许吧,但是 避免弄脏挑剔的人 push 原型。我将下面的陈述分解:

    $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;
    }
    
        3
  •  2
  •   Brad Gilbert    15 年前
    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 ];
        }
    }