是否有一种优雅的方法来指定子程序参数的默认值?
目前,我使用以下方法:
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...
sub func1 {
my $arg1 = shift;
my $arg2 = shift;
my %opt = (
opt1 => 'default',
opt2 => 'default',
@_
);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用Params :: Validate.
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |