That's a clever way of doing it. Of course its only
useful if the subroutine you are writing is expecting
exactly 0 or 1 argument.
If the subroutine allows multiple arguments with only
some being optional, the above approach will not work.
| [reply] |
Well, it works if the optional arguments are all trailing.
sub lotsaArgs {
my $arg1 = 'default';
$arg1 = shift if @_;
my $arg2 = 'default';
$arg2 = shift if @_;
my $arg3 = 'default';
$arg3 = shift if @_;
my $arg4 = 'default';
$arg4 = shift if @_;
...
}
This would be analogous to default arguments in C++, for instance.
If you want to have named arguments, and only pass some of them, then the hash of default values and
my %args=(%defaults,@_);
as suggested below is obviously better.
But as asked, he seemed to have only one arg to default.
--
Mike | [reply] [d/l] [select] |
If you wanted to avoid using a hash of named arguments for whatever reason, but wanted to avoid typing
my $argN="default";
$argN=shift if @_;
repeatedly, perhaps the following would be useful :
&foo (1,2,3);
sub foo {
my @defaults= qw (foo bar baz quux quuz boo);
for (1.. @_) {shift @defaults};
@_= (@_, @defaults);
($a1, $a2, $a3, $a4, $a5, $a6) = @_;
print join "\n",$a1, $a2, $a3, $a4, $a5, $a6;
}
This doesn't check that a user's supplied too many parameters, but that shouldn't be too hard to add in.
Of course, as mentioned elsewhere, this is all moot once // comes into play, but it's an interesting mental exercise.
An additional note : this assumes that parameters are given in "least optional" to "most optional"; if you have 6 params and only #2 is optional, this won't do it for you. | [reply] [d/l] [select] |