Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you access function parameters in Perl?

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?
}
like image 974
JOSHUA Avatar asked Apr 19 '11 15:04

JOSHUA


People also ask

How do you pass a function parameter in Perl?

You can pass various arguments to a Perl subroutine like you do in any other programming language and they can be accessed inside the function using the special array @_. Thus the first argument to the function is in [0],thesecondisin_[1], and so on.

How do you call a function in Perl?

The word subroutines is used most in Perl programming because it is created using keyword sub. Whenever there is a call to the function, Perl stop executing all its program and jumps to the function to execute it and then returns back to the section of code that it was running earlier.

How do function parameters work?

A function parameter is a variable used in a function. Function parameters work almost identically to variables defined inside the function, but with one difference: they are always initialized with a value provided by the caller of the function.


1 Answers

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.

like image 103
CanSpice Avatar answered Oct 11 '22 17:10

CanSpice