Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Explicitly check for argument presence...

by RMGir (Prior)
on Apr 22, 2002 at 16:55 UTC ( [id://161100]=note: print w/replies, xml ) Need Help??


in reply to Default subroutine parameters

sub mysub { my $foo='default'; $foo = shift if @_; }

--
Mike

Delayed post: I keep hitting Newest Nodes from the preview page, then wondering why my post doesn't show up. D'oh! :)

Replies are listed 'Best First'.
Re: Explicitly check for argument presence...
by ehdonhon (Curate) on Apr 22, 2002 at 18:02 UTC

    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.

      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

        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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://161100]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (2)
As of 2024-04-19 20:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found