Как я могу перебрать ссылку на массив Perl? - PullRequest
16 голосов
/ 27 августа 2009

У меня есть массив, который является членом структуры:

$self->{myArray} = ["value1", "value2"];

И я пытаюсь перебрать его, используя следующий код:

my @myArray = $self->{myArray};
foreach my $foo (@myArray){
    #Do something with the using $foo
    ...
}

Проблема в том, что цикл foreach выполняется только один раз (когда я ожидал, что он будет выполнен дважды, поскольку @myArray имеет два элемента: «value1» и «value2»).

Когда я проверяю размер массива @myArray, я получаю, что его размер равен 1. Что я делаю не так в этом коде?

Ответы [ 3 ]

28 голосов
/ 27 августа 2009

Я считаю, что:

$self->{myArray} returns a reference.

Вы хотите вернуть массив:

@{$self->{myArray}}
10 голосов
/ 27 августа 2009

$self->{myArray} является ссылкой на массив. Вы должны разыменовать это.

my @myArray = @{ $self->{myArray} };

В подобных ситуациях очень полезен модуль Data::Dumper. Например, если @myArray не работает должным образом, вы можете запустить этот код, чтобы выявить проблему.

use Data::Dumper;
print Dumper(\@myArray);
6 голосов
/ 27 августа 2009

$ self -> {myArray} - это ссылка на массив, а не массив - вы не можете хранить реальные массивы внутри хеша, только ссылки. Попробуйте это:

my $myArray = $self->{myArray};
for my $foo (@$myArray){
   # do something with $foo
}

Вы также можете взглянуть на perldoc perlref .

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