Как я могу передать массив, полученный из метода Perl, по ссылке? - PullRequest
0 голосов
/ 12 июня 2010

Некоторые XML::LibXML методы возвращают массивы вместо ссылок на массивы.

Вместо этого:

$self->process_items($xml->findnodes('items/item'));

Я хочу сделать что-то вроде:

$self->process_items(\$xml->findnodes('items/item'));

Так что в process_items() я могу разыменовать исходный массив вместо создания копии:

sub process_items {
    my ($self, $items) = @_;
    foreach my $item (@$items) {
        # do something...
    }
}

Я всегда могу сохранить результаты findnodes() в массиве, а затем передать ссылку на массив своему собственному методу, но, скажем, я хочу попробовать уменьшенную версию своего кода. Это правильный синтаксис для передачи результатов метода или я должен использовать что-то другое?

Спасибо!

EDIT:

Теперь предположим, что я хочу изменить process_items() на process_item(), чтобы я мог делать вещи для каждого элемента массива, на который ссылаются, используя цикл for. Что-то вроде:

$self->process_item($_) for ([ $xml->findnodes('items/item') ]);

Это не работает, поскольку process_item() выполняется только один раз, потому что в цикл for передается одно значение (ссылка на массив из findnodes()). Как правильно использовать $_ в этом случае?

Ответы [ 2 ]

3 голосов
/ 12 июня 2010
sub  do_something {
    (1, 2, 3, 4);
}

print [ do_something ];

Это даст мне ссылку на массив.

EDIT:

так, в вашем случае это будет:

$self->process_items([ $xml->findnodes('items/item') ]);

, в этом случае $self->process_items получает arrayref. Точно так же, если вы хотите создать хеш-ссылку из возвращаемого значения функции, вы должны поставить {и} вокруг возвращаемого значения.

РЕДАКТИРОВАТЬ 2:

Что касается вашего второго вопроса, for() принимает массив, поэтому вместо выполнения for([ my_list ]) вы бы сделали for( @{ [ my_list ] } ). @{} генерирует массив из списка. ${} производит скаляр из скалярного реф.

0 голосов
/ 14 июня 2010

Вы не можете сделать for для arrayref, потому что он видит только одну вещь, сам arrayref, а не содержимое. Вам нужно будет передать ссылку на каждый элемент, если вы хотите работать таким образом, используя что-то вроде:

map {$self->process_item(\$_)} $xml->findnodes('items/item');

sub process_item {
  my $item = shift;
  $item = $$item;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...