Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
723 views
in Technique[技术] by (71.8m points)

perl - How to specify default values for optional subroutine arguments?

Is there an elegant way to specify default values for subroutine arguments?

Currently, I am using the following approach:

use strict;
use warnings;

func1( "arg1", "arg2", opt1 => "first option", opt2 => 0 );

sub func1 {
    my ( $arg1, $arg2, %opt ) = @_;

    $opt{opt1} //= "no option";
    $opt{opt2} //= 1;
    $opt{opt3} //= [];
}

which looks a little bit ugly, when there are many options. I would rather like to do

sub func2 {
    my ( $arg1, $arg2, $opt ) = process_args( 
        opt1 => "no option", opt2 => 1, opt3 => []
    );
}

The best I could come up with for this approach was:

sub func2 {
    my ( $arg1, $arg2, $opt ) = process_args(
        @_, 2, opt1 => "no option", opt2 => 1, opt3 => []
    );
}

sub process_args {
    my ($a, $n, %opt_info ) = @_;

    my @b = splice @$a, 0, $n;
    my %opt = @$a;
    for my $key (keys %opt_info) {
        $opt{$key} //= $opt_info{$key};
    }
    return (@b, \%opt);
}

but now I got the other problem, that I must pass @_ and the number of non-option arguments ( here 2 ), to process_args..

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
sub func1 {
    my $arg1 = shift;
    my $arg2 = shift;
    my %opt = (
       opt1 => 'default',
       opt2 => 'default',
       @_
    );

Or, you can use Params::Validate.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...