in reply to Re: Explicitly check for argument presence...
in thread Default subroutine parameters

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

Replies are listed 'Best First'.
Re: (3) Explicitly check for argument presence... (boo)
by boo_radley (Parson) on Apr 22, 2002 at 23:14 UTC
    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.