Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 作为类成员的动态数组_Arrays_Perl_Class - Fatal编程技术网

Arrays 作为类成员的动态数组

Arrays 作为类成员的动态数组,arrays,perl,class,Arrays,Perl,Class,有以下类别: package MyClass; use strict; use warnings; sub new { my $class = shift(); my $self = { _class_array => [] }; bless ($self, $class); return $self; } 如何设置/获取此数组的附加值 我尝试了以下代码: sub AddDataType { my $self = shift(

有以下类别:

package MyClass;

use strict;
use warnings;

sub new
{
    my $class = shift();
    my $self = {
        _class_array => []
};

    bless ($self, $class);
    return $self;
}
如何设置/获取此数组的附加值

我尝试了以下代码:

sub AddDataType
{
    my $self = shift();
    my $new_element = shift();
    my @array = $self->{_class_array};

    print("Number of elements ".($self->{_class_array})."\n");
    push(@array, $new_element);
    $self->{_class_array} = @array;
    
    print("Element added. Number of elements ".($self->{_class_array})."\n");
}
输出如下:

数组的元素数(0x21bb4c)

添加了元素。类型数2

元素数2

添加了元素。类型数2

元素数2

添加了元素。类型数2

问题是:

  • 这意味着什么:
    元素数数组(0x21bb4c)
  • 为什么数组长度始终保持
    2

  • 您正在使用arrayref作为数组。尝试:

    sub AddDataType {
        my ( $self, $new_element ) = @_;
    
        print "Number of elements " . scalar @{ $self->{_class_array} } . "\n"; 
        push @{ $self->{_class_array} }, $new_element;
        print "Element added. Number of elements " . scalar @{ $self->{_class_array} } . "\n";
    
        return;
    }
    

    您正在使用arrayref作为数组。尝试:

    sub AddDataType {
        my ( $self, $new_element ) = @_;
    
        print "Number of elements " . scalar @{ $self->{_class_array} } . "\n"; 
        push @{ $self->{_class_array} }, $new_element;
        print "Element added. Number of elements " . scalar @{ $self->{_class_array} } . "\n";
    
        return;
    }
    

    正如其他人所指出的,数组类元素是数组引用。您的方法应该如下所示

    sub AddDataType {
        my ($self, $new_element) = @_;
        my $array = $self->{_class_array};
        print "Number of elements " . scalar @$array . "\n";
        push @$array, $new_element;
        print "Element added. Number of elements " . scalar @$array . "\n";
    }
    

    正如其他人所指出的,数组类元素是数组引用。您的方法应该如下所示

    sub AddDataType {
        my ($self, $new_element) = @_;
        my $array = $self->{_class_array};
        print "Number of elements " . scalar @$array . "\n";
        push @$array, $new_element;
        print "Element added. Number of elements " . scalar @$array . "\n";
    }
    

    你已经有很好的答案了。我只想提一提,这真的可以让这种属性变得简单/有趣

    BEGIN {
        package MyClass;
        use Moose;
        has "data" =>
            traits  => ["Array"],
            is      => "ro",
            isa     => "ArrayRef[Str]",
            default => sub { [] },
            handles => {
                AddDataType => "push",
                DataCount   => "count",
                NoData      => "is_empty",
                AllData     => "elements",
            };
    }
    
    my $thingy = MyClass->new();
    print "DOES HAS DATAS? ", $thingy->NoData ? "NOE" : "YES", $/;
    $thingy->AddDataType("OHAI");
    print "CAN HAS DATA? ", $thingy->NoData ? "NOE" : "YES", $/;
    $thingy->AddDataType(qw/ ANUDDER CUPLA HERE / );
    print "I HAZ DATAS: ", $thingy->DataCount, $/;
    print "HERE DEY IS: ", join(", ", $thingy->AllData), $/;
    
    __DATA__
    DOES HAS DATAS? NOE
    CAN HAS DATA? YES
    I HAZ DATAS: 4
    HERE DEY IS: OHAI, ANUDDER, CUPLA, HERE
    

    你已经有很好的答案了。我只想提一提,这真的可以让这种属性变得简单/有趣

    BEGIN {
        package MyClass;
        use Moose;
        has "data" =>
            traits  => ["Array"],
            is      => "ro",
            isa     => "ArrayRef[Str]",
            default => sub { [] },
            handles => {
                AddDataType => "push",
                DataCount   => "count",
                NoData      => "is_empty",
                AllData     => "elements",
            };
    }
    
    my $thingy = MyClass->new();
    print "DOES HAS DATAS? ", $thingy->NoData ? "NOE" : "YES", $/;
    $thingy->AddDataType("OHAI");
    print "CAN HAS DATA? ", $thingy->NoData ? "NOE" : "YES", $/;
    $thingy->AddDataType(qw/ ANUDDER CUPLA HERE / );
    print "I HAZ DATAS: ", $thingy->DataCount, $/;
    print "HERE DEY IS: ", join(", ", $thingy->AllData), $/;
    
    __DATA__
    DOES HAS DATAS? NOE
    CAN HAS DATA? YES
    I HAZ DATAS: 4
    HERE DEY IS: OHAI, ANUDDER, CUPLA, HERE
    

    []
    是对数组的引用,因此
    $self->{u class\u array}
    也是一个引用。要访问原始数组,必须取消对它的引用:
    @{$array\u reference}
    。这本书可能是一本好书。将arrayref分配给
    @array
    会使
    @array
    包含引用,而不是指向同一数组。
    []
    是对数组的引用,因此
    $self->{u class\u array}
    也是一个引用。要访问原始数组,必须取消对它的引用:
    @{$array\u reference}
    。这本书可能是一本好书。将arrayref分配给
    @array
    会使
    @array
    包含引用,而不是指向同一数组。