2012-11-25 56 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);