Методы доступа для массивов в Perl - PullRequest
1 голос
/ 31 марта 2011

У меня есть объект, который хранит массивы в качестве переменных экземпляра. Поскольку 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 ]

8 голосов
/ 31 марта 2011

Код, который вы опубликовали, вызывает время выполнения "Не ссылка на массив ..." Ошибка.Причина в том, что _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;
}
0 голосов
/ 31 марта 2011

Я вполне уверен, что проблема, с которой вы столкнулись в

my $self = {
    #$[0] is the class
    _name => $_[1],
    _owned_files => \[],
    _shared_files => \[],        
};

раздел. _owned_file=> \[] не создаст и ссылку на массив, а скорее ссылку на ссылку на массив. Скорее всего, вы хотите _owned_files => []. То же самое для общих файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...