最简洁的方法是只在哈希值存在的情况下分配值?

时间:2012-11-25 08:39:26

标签: perl

我发现自己经常编写这样的代码:

if ($optionalParamsRef->{verbosity}) {
    $settingsHash{verbosity} = $optionalParamsRef->{verbosity};
}

然而,重复$optionalParamsRef->{verbosity}两次似乎非常冗长。有更短的方式吗?

编辑:是的,我意识到这是在检查是/否,而不是'存在'。我正在寻找的是与此相当的简洁功能。

4 个答案:

答案 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 );