Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
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 taking refuge in the Monastery: (4)
As of 2024-04-25 15:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found