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 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…