views:

124

answers:

5

I have a list that contains arguments I want to pass to a function. How do I call that function?

For example, imagine I had this function:

sub foo {
  my ($arg0, $arg1, $arg2) = @_;
  print "$arg0 $arg1 $arg2\n";
}

And let's say I have:

my $args = [ "la", "di", "da" ];

How do I call foo without writing foo($$args[0], $$args[1], $$args[2])?

+6  A: 

Try this:

foo(@$args);
Chris Jester-Young
+9  A: 

This should do it:

foo(@$args)

That is not actually an apply function. That syntax just dereferences an array reference back to plain array. man perlref tells you more about referecences.

Juha Syrjälä
You might also consider not constructing the reference to begin with, i.e. `@args = ("la", "de", "dah")` or even `@args = qw(la de dah);` and then passing it with `foo(@args)`. This is cleaner and more straightforward than doing the reference dance, though if you have other constraints (the array is already part of a data structure, for instance) it's not a huge deal.
fennec
+10  A: 

You dereference an array reference by sticking @ in front of it.

foo( @$args );

Or if you want to be more explicit:

foo( @{ $args } );
friedo
+4  A: 
foo(@$args);

Or, if you have a reference to foo:

my $func = \&foo;
...
$func->(@$args);
cjm
+2  A: 

It's simple. foo(@{$args})

aartist