我有一个将数组存储为实例变量的对象。由于Perl似乎不支持这一点,我必须存储对数组的引用。但是,我无法弄清楚如何在创建这些数组后改变这些数组;这些方法似乎只改变了本地副本。 (目前,在addOwnedFile()结束时,对象数据不变)。
sub new {
my ($class) = @_;
my @owned_files = ();
my @shared_files = ();
my $self = {
#$[0] is the class
_name => $_[1],
_owned_files => \[],
_shared_files => \[],
};
bless $self, $class;
return $self;
}
#Add a file to the list of files that a user owns
sub addOwnedFile {
my ($self, $file) = @_;
my $ref = $self -> {_owned_files};
my @array = @$ref;
push(@array, $file);
push(@array, "something");
push(@{$self->{_owned_files}}, "something else");
$self->{_owned_files} = \@array;
}
答案 0 :(得分:8)
您发布的代码会触发运行时“Not a ARRAY reference ...”错误。原因是将_owned_files
设置为\[]
,它不是数组引用,而是对数组引用的引用。从两个数组属性中删除\
。
有了这个,我们可以解决下一个问题。 @array
是对象持有的匿名数组的副本。您的前两个push
是复制,最后一个是保持的数组。然后,通过将其替换为对副本的引用来破坏保留的数组。最好通过引用处理原始数组。以下任何一种都可以使用:
push @$ref, 'something';
push @{$self->{_owned_files}}, 'something';
然后放弃
$self->{_owned_files} = \@array;
最后。
sub new {
my $class = shift;
my $name = shift;
my $self = {
_name => $name,
_owned_files => [],
_shared_files => [],
};
return bless $self, $class;
}
sub addOwnedFile {
my ($self, $file) = @_;
push @{$self->{_shared_files}}, $file;
}
答案 1 :(得分:0)
我很确定你在
中遇到的问题my $self = {
#$[0] is the class
_name => $_[1],
_owned_files => \[],
_shared_files => \[],
};
部分。 _owned_file=> \[]
不会创建和数组引用,而是对数组引用的引用。而你想要的是_owned_files => []
。共享文件也是如此。