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?
}
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.
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.
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.
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:
@_
or individual elements within it as $_[0]
, $_[1]
, and so onby 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With