如何为可选子例程参数指定默认值?

Håk*_*and 2 perl

是否有一种优雅的方法来指定子程序参数的默认值?

目前,我使用以下方法:

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} //= [];
}
Run Code Online (Sandbox Code Playgroud)

当有很多选择时,它看起来有点难看.我宁愿这样做

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

我能想出的最好的方法是:

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);
}
Run Code Online (Sandbox Code Playgroud)

但现在我遇到了另一个问题,我必须通过\@_非选项参数(这里是2)的数量来process_args...

Sin*_*nür 6

sub func1 {
    my $arg1 = shift;
    my $arg2 = shift;
    my %opt = (
       opt1 => 'default',
       opt2 => 'default',
       @_
    );
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Params :: Validate.