Perl中数组的访问器方法

时间:2011-03-31 00:58:57

标签: perl oop

我有一个将数组存储为实例变量的对象。由于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;
}

2 个答案:

答案 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 => []。共享文件也是如此。