【发布时间】:2014-12-16 15:12:24
【问题描述】:
我正在尝试使模块的函数接受以下形式的可选参数:
function(arg1, optional1 => opt1, optional2 => opt2, ..);
但我找不到任何地方可以很好地解释如何做到这一点。我想出了以下解决方案来接受 email、alpha 和 html 参数,但它非常复杂,我不敢相信没有更短的方法可以实现这一点:
sub test
{
my ($s, @args) = @_;
my $alpha = 1;
my $html = 0;
my $email = 0;
for(my $i = 0; $i < scalar(@args); $i++)
{
if($args[$i] eq "alpha")
{
$i++;
$alpha = $args[$i];
}
elsif($args[$i] eq "email")
{
$i++;
$email = $args[$i];
}
elsif($args[$i] eq "html")
{
$i++;
$html = $args[$i];
}
}
return ($alpha, $email, $html);
}
my ($a, $b, $c) = test("stuff", ndhgffs => 1, email => 1, alpha => 0);
print $a . $b . $c;
编辑:
感谢下面的答案和下面的cmets,这解决了它:
sub test
{
my ($s, %opts) = @_;
my $email = $opts{'email'} // 0;
my $alpha = $opts{'alpha'} // 1;
my $html = $opts{'html'} // 0;
return ($alpha, $email, $html);
}
【问题讨论】:
-
另一种方法是传递哈希引用。
-
alpha是布尔值吗?如果是这样,$opts{'alpha'} // 1很容易出错。考虑$opts{'no_alpha'} // 0(或只是$opts{'no_alpha'})。 -
OT 但是如何使用函数签名来处理这个问题?可以发布 5.20
use experimental 'signatures'为这类事情提供更干净的“成语”吗?当您有复杂的函数参数时,从@_抓取东西似乎非常整洁/干净并且可以自我记录...... TIMTOWTDI && ♥ perl :-) -
在这个例子中是的,函数将是布尔值,尽管我认为
//也应该与字符串一起使用..
标签: perl function subroutine