某些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()
引用数组)。在这种情况下使用$_
的正确方法是什么?
答案 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;
}