我发现自己经常编写这样的代码:
if ($optionalParamsRef->{verbosity}) {
$settingsHash{verbosity} = $optionalParamsRef->{verbosity};
}
然而,重复$optionalParamsRef->{verbosity}
两次似乎非常冗长。有更短的方式吗?
编辑:是的,我意识到这是在检查是/否,而不是'存在'。我正在寻找的是与此相当的简洁功能。
答案 0 :(得分:4)
请注意,您正在检查$optionalParamsRef->{verbosity}
true ,而不是存在。
可能的方法:
foreach my $k (qw/verbosity param1 param2 param3/) { #Enumerate keys here
$settingsHash{$k} = $optionalParamsRef->{$k} if exists($optionalParamsRef->{$k});
}
答案 1 :(得分:4)
正如其他人提到的,您的代码会检查错误。如果您将错误值视为不存在,则可以使用逻辑或。可能这不是你想要的。
$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || $default;
但也许定义 - 这就足够了。它仍然没有检查是否存在,但如果你的哈希值不包含undef
值,这就足够了:
$settingsHash{verbosity} = $optionalParamsRef->{verbosity} // $default;
使用“new”defined-或operator //
代替逻辑或||
。我知道这些例子并不等同于您发布的代码,因为它们已经分配了一些东西,但根据我的经验,这通常很有用,所以它可能会有所帮助。
答案 2 :(得分:0)
my $v = $optionalParamsRef->{verbosity};
$settingsHash{verbosity} = $v if $v;
for ($optionalParamsRef->{verbosity}) {
$settingsHash{verbosity} = $_ if $_;
}
答案 3 :(得分:0)
简明的功能等同物:
sub {$_[0]=$_[1] if $_[1]}->($settingsHash{verbosity}, $optionalParamsRef->{verbosity});
然而,IMO,你的代码的主要问题是你只是有条件地设置$ settingsHash {verbosity},阻止你做一些更简单的事情:
$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || somedefault
甚至:
%settingsHash = ( %defaultSettings, %$optionalParamsRef );