2010-06-12 29 views
0

一些XML::LibXML方法返回数组而不是对数组的引用。如何通过引用传递一个Perl方法产生的数组?

而不是这样做:

$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循环引用数组的每个元素上做的东西。是这样的:因为一个单一的值被传递到for环路(从findnodes()所述参考阵列)

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

这并不作为process_item()工作只执行一次。在这种情况下使用$_的正确方法是什么?

+0

这不是我清楚你的编辑是否是一个新的问题或furbishing原问题的进一步的细节。如果是前者,我建议你发布一个新问题。如果是后者,那么我觉得你的问题需要一些重新说明。 – Zaid 2010-06-12 13:42:11

+0

@zaid:是后者。我已经改变了文本,因此它更清晰。 – arareko 2010-06-14 17:35:13

回答

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

print [ do_something ]; 

这给了我一个数组ref。

编辑:

所以,你的情况,这将是:

在这种情况下
$self->process_items([ $xml->findnodes('items/item') ]); 

$self->process_items得到一个数组引用。同样,如果您希望将hashref放在函数的返回值之外,则可以将{和}放在返回值的附近。

编辑2:

关于你的第二个问题,for()需要一个数组,这样,而不是做for([ my_list ])你会做for(@{ [ my_list ] })@{}从列表中生成一个数组。 ${}从标量引用生成一个标量。

0

你不能对阵arrayref做一次,因为它只看到一件事情,即arrayref本身,而不是内容。你必须传递到每个项目的参考,如果你想工作的方式,使用类似:

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

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