tags:

views:

68

answers:

2

Some XML::LibXML methods return arrays instead of references to arrays.

Instead of doing this:

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

I want to do something like:

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

So that in process_items() I can dereference the original array instead of creating a copy:

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

I can always store the results of findnodes() into an array and then pass the array reference to my own method, but let's say I want to try a reduced version of my code. Is that the correct syntax for passing the method results or should I use something different?

Thanks!

EDIT:

Now suppose I want to change process_items() to process_item() so I can do stuff on each element of the referenced array using a for loop. Something like:

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

This doesn't work as process_item() is executed only once because a single value is passed to the for loop (the reference to the array from findnodes()). What's the proper way of using $_ in this case?

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

print [ do_something ];

This give me an array ref.

EDIT:

so, in your case, that would be:

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

in which case, $self->process_items gets an arrayref. Similarly, if you wanted to make a hashref out of the return value of a function, you would put { and } around the return value.

EDIT 2:

As for your second question, for() takes an array, so, instead of doing for([ my_list ]) you would do for( @{ [ my_list ] } ). @{} generates an array from a list. ${} produces a scalar from a scalar-ref.

fengshaun
A: 

You can't do a for against an arrayref because it only sees one thing, the arrayref itself, not the contents. You'll have to pass a reference to each item if you want to work that way, using something like:

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

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