How do you access function parameters in Perl?

JOSHUA picture JOSHUA · Apr 19, 2011 · Viewed 20.6k times · Source

In C++ I would do something like this:

void some_func(const char *str, ...);
some_func("hi %s u r %d", "n00b", 420);

In PHP I would do like this:

function some_func()
{
    $args = func_get_args();
}
some_func($holy, $moly, $guacomole);

How do I do that in Perl?

sub wut {
    # What goes here?
}

Answer

CanSpice picture CanSpice · Apr 19, 2011

You would do:

sub wut {
  my @args = @_;
  ...
}

Perl automatically populates the special @_ variable when you call a function. You can access it in multiple ways:

  • directly, by simply using @_ or individual elements within it as $_[0], $_[1], and so on
  • by assigning it to another array, as shown above
  • by assigning it to a list of scalars (or possibly a hash, or another array, or combinations thereof):

    sub wut {
      my ( $arg1, $arg2, $arg3, @others ) = @_;
      ...
    }

Note that in this form you need to put the array @others at the end, because if you put it in earlier, it'll slurp up all of the elements of @_. In other words, this won't work:

sub wut {
  my ( $arg1, @others, $arg2 ) = @_;
  ...
}

You can also use shift to pull values off of @_:

sub wut {
  my $arg1 = shift;
  my $arg2 = shift;
  my @others = @_;
  ...
}

Note that shift will automatically work on @_ if you don't supply it with an argument.

Edit: You can also use named arguments by using a hash or a hash reference. For example, if you called wut() like:

wut($arg1, { option1 => 'hello', option2 => 'goodbye' });

...you could then do something like:

sub wut {
  my $arg1 = shift;
  my $opts = shift;
  my $option1 = $opts->{option1} || "default";
  my $option2 = $opts->{option2} || "default2";
  ...
}

This would be a good way to introduce named parameters into your functions, so that you can add parameters later and you don't have to worry about the order in which they're passed.