Acessing function parameters in Perl

Watch out! This tutorial is over 6 years old. Please keep this in mind as some code snippets provided may no longer work or need modification to work on current systems.
Tutorial Difficulty Level    

Perl functions don’t have parameters, their arguments are passed in an array @_. You can simulate parameters by assigning to a list, but you can also just apply the usual array operations to @_.

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

To put in another way, Perl automatically populates the special @_ variable each time 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.

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.