如何通过引用传递Perl方法产生的数组?

时间:2010-06-12 03:20:26

标签: perl reference

某些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()的结果存储到数组中,然后将数组引用传递给我自己的方法,但是假设我想尝试我的代码的简化版本。这是传递方法结果的正确语法还是我应该使用不同的东西?

谢谢!

编辑:

现在假设我想将process_items()更改为process_item(),这样我就可以使用for循环对引用数组的每个元素执行操作。类似的东西:

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

这不起作用,因为process_item()只执行一次,因为单个值传递给for循环(从findnodes()引用数组)。在这种情况下使用$_的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

sub  do_something {
    (1, 2, 3, 4);
}

print [ do_something ];

这给我一个阵列参考。

编辑:

所以,在你的情况下,那将是:

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

在这种情况下,$self->process_items获取一个arrayref。类似地,如果你想从函数的返回值中创建一个hashref,你可以将{和}放在返回值周围。

编辑2:

关于你的第二个问题,for()采用数组,因此,for([ my_list ])代替for( @{ [ my_list ] } )进行@{}${}从列表中生成一个数组。 {{1}}从标量参考中生成标量。

答案 1 :(得分:0)

你不能对一个arrayref做一个,因为它只看到一件事,即arrayref本身,而不是内容。如果你想以这种方式工作,你将不得不传递对每个项目的引用,使用类似的东西:

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

sub process_item {
  my $item = shift;
  $item = $$item;
}