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
包含引用,而不是指向同一数组。