繁体   English   中英

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

[英]How can I pass an array resulting from a Perl method by 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循环对引用数组的每个元素for 就像是:

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

由于process_item()仅执行一次,因为将单个值传递给for循环( findnodes()对数组的引用),因此该方法findnodes() 在这种情况下,使用$_的正确方法是什么?

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 ] } ) @{}从列表中生成一个数组。 ${}从标量引用生成标量。

您不能针对arrayref做for,因为它只能看到一件事,即arrayref本身,而不是内容。 如果您想以这种方式工作,则必须传递对每个项目的引用,方法如下:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM