Recipe 10.7 Passing by Named Parameter
10.7.1 Problem
You want to make
a function with many parameters that are easy to call so that
programmers remember what the arguments do, rather than having to
memorize their order.
10.7.2 Solution
Name each parameter in the call:
thefunc(INCREMENT => "20s", START => "+5m", FINISH => "+30m");
thefunc(START => "+5m", FINISH => "+30m");
thefunc(FINISH => "+30m");
thefunc(START => "+5m", INCREMENT => "15s");
Then in the subroutine, create a hash loaded up with default values
plus the array of named pairs.
sub thefunc {
my %args = (
INCREMENT => '10s',
FINISH => 0,
START => 0,
@_, # argument pair list goes here
);
if ($args{INCREMENT} =~ /m$/ ) { ... }
}
10.7.3 Discussion
Functions whose arguments require a particular order work well for
short argument lists, but as the number of parameters increases, it's
awkward to make some optional or have default values. You can only
leave out trailing arguments, never initial ones.
A more flexible approach allows the
caller to supply arguments using name-value pairs. The first element
of each pair is the argument name; the second, its value. This makes
for self-documenting code because you can see the parameters'
intended meanings without having to read the full function
definition. Even better, programmers using your function no longer
have to remember argument order, and they can leave unspecified any
extraneous, unused arguments.
This works by having the function declare a private hash variable to
hold the default parameter values. Put the current arguments,
@_, after the default values, so the actual
arguments override the defaults because of the order of the values in
the assignment.
A common variation on this is to preface the parameter name with a
hyphen, intended to evoke the feel of command-line parameters:
thefunc(-START => "+5m", -INCREMENT => "15s");
Ordinarily the hyphen isn't part of a bareword, but the Perl
tokenizer makes an exception for the =>
operator to permit this style of function argument.
10.7.4 See Also
Chapter 4
|