2012-11-25 22 views
4

我发现自己经常写这样的代码:只有存在哈希值时,才能从哈希值中分配值的最简洁方法?

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

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

编辑:是的,我意识到这是检查真/假而不是'存在'。我正在寻找的是一个简洁的功能等同于此。

+1

注意,这不是测试 “如果存在”。它会因“虚假”值而失败。 – Thilo

+0

这种技术会将key'verbosity'(w/value undef)添加到$ optionalParamsRef(如果它尚不存在)。没有什么大不了的,如果你不在乎改变$ optionalParamsRef。 – ddoxey

回答

0
my $v = $optionalParamsRef->{verbosity}; 
$settingsHash{verbosity} = $v if $v; 

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

注意要检查$optionalParamsRef->{verbosity}真正,不存在

可能的方式做到这一点:

foreach my $k (qw/verbosity param1 param2 param3/) { #Enumerate keys here 
    $settingsHash{$k} = $optionalParamsRef->{$k} if exists($optionalParamsRef->{$k}); 
} 
+2

'%settingsHash =(%settingsHash,%$ optionalParamsRef);' – melpomene

+0

谢谢。根据迄今为止的两个答案,这两种解决方案都涉及将其分配给名称较短的新变量。我想我希望有一种更“本土”的方式来避免重复。 –

+0

@melpomene如果他想将'optionalParamsRef'合并到'settingsHash'中,它的好方法。有时更好,有时不更好。 – PSIAlt

4

正如其他人所提到的,你的代码检查错误的烦躁。如果您认为虚假值不存在,则可以使用逻辑或。可能这不是你想要的。

$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || $default; 

但是也许定义已经足够了。它仍然是存在没有检查,但如果你的哈希值不包含undef值,这可能是不够的:

$settingsHash{verbosity} = $optionalParamsRef->{verbosity} // $default; 

使用“新”定义 - 或操作//而不是逻辑或||。我知道这些例子并不等同于你发布的代码,因为他们分配了一些东西,但根据我的经验,这通常是有用的,所以也许它可以提供帮助。

+1

//我是在寻找这个问题时寻找的东西,但不是OP要求的。给了我一点窘境,我被迫投了赞成票和其他答案,这些答案确切地回答了那些给出确切答案和给予有用选择的答案的公平答案。:)谢谢你以任何方式哈哈。 – dsollen

0

简明的功能等同的:

sub {$_[0]=$_[1] if $_[1]}->($settingsHash{verbosity}, $optionalParamsRef->{verbosity}); 

然而,IMO,与您的代码的主要问题是,你只能有条件地设置$ settingsHash {冗长},让你从做简单的东西,如:

$settingsHash{verbosity} = $optionalParamsRef->{verbosity} || somedefault 

甚至:

%settingsHash = (%defaultSettings, %$optionalParamsRef);