2012-10-01 19 views
0

我有一個複雜結構的哈希,我想執行搜索和替換。第一個散列如下所示:比較和編輯哈希中的底層結構

$VAR1 = { 
    abc => { 123 => ["xx", "yy", "zy"], 456 => ["ab", "cd", "ef"] }, 
    def => { 659 => ["wx", "yg", "kl"], 456 => ["as", "sd", "df"] }, 
    mno => { 987 => ["lk", "dm", "sd"] }, 
} 

,我要反覆搜索所有「123」 /「456」的元素,如果找到匹配,我需要做的子層,即比較的['ab','cd','ef']['as','sd','df'],在這種情況下,只保留['ab','cd','ef']。所以輸出如下:

$VAR1 = { 
    abc => { 123 => ["xx", "yy", "zy"], 456 => ["ab", "cd", "ef"] }, 
    def => { 659 => ["wx", "yg", "kl"] }, 
    mno => { 987 => ["lk", "dm", "sd"] }, 
} 

所以刪除是基於子結構,而不是索引。如何做呢?謝謝您的幫助!!假設我將聲明要保留的值,即基於預先聲明的值[「ab」,「我」將保留456 => [「ab」,「cd」,「ef」]] cd「,」ef「]並刪除任何其他地方的其他456實例。搜索必須針對每個密鑰。所以代碼將通過散列,首先取123 => [「xx」,「yy」,「zy」],並將其與整個散列的其餘部分的鍵進行比較,如果未找到匹配,則不執行任何操作。如果找到匹配,就像456 => [「ab」,「cd」,「ef」]一樣,它會比較兩者,並且正如我所說的那樣,如果匹配時使用[「 ab「,」cd「,」ef「]將被保留,它將保持456 => [」ab「,」cd「,」ef「]並丟棄散列中任何其他地方的任何其他456實例,在這種情況下刪除456 => [「as」,「sd」,「df」]。

+1

看看[perldsc(http://perldoc.perl.org/perldsc.html)..這是所有這些東西只有.. 特別'hashes' –

+0

的哈希值,您應該指定如何決定應該保留其中的條目。 – darch

+0

你讓我看看這個。我只能說「什麼?」 – ikegami

回答

0

下面是一個使用智能匹配運算符來執行數組進行比較的解決方案:

更新:如鮑羅廷指出,我原來的代碼是錯誤的。這是固定版本。

更新2:更改它以根據散列結構選擇要保留的值。

my $VAR1 = { 
    abc => { 123 => ["xx", "yy", "zy"], 456 => ["ab", "cd", "ef"] }, 
    def => { 659 => ["wx", "yg", "kl"], 456 => ["as", "sd", "df"] }, 
    mno => { 987 => ["lk", "dm", "sd"] }, 
}; 

my %keep_values = (
    '456' => ['ab','cd','ef'] 
); 

foreach my $outer_key (keys %$VAR1) 
{ 
    foreach my $keepers (keys %keep_values) 
    { 
     if (exists $VAR1->{$outer_key}{$keepers} and 
      #use the smart match operator to compare arrays. 
      !(@{$VAR1->{$outer_key}{$keepers}} ~~ @{$keep_values{$keepers}})) 
     { 
      delete $VAR1->{$outer_key}{$keepers}; 
     } 
    } 
} 

有關智能匹配運算符的更多信息,請參見perlop

+0

非常感謝dan1111,問題是,我需要整個事情是動態的,所以我不能定義$ match_key或@match_array。它需要獨立於我給出的任何輸入... –

+0

然後,你必須澄清'['ab','cd','ef']'是什麼特別的,這使得你可以通過'['as' 'SD', 'DF']'。這很不明顯 – Borodin

+1

這是非常糟糕的代碼。你沒有'使用嚴格'或'使用警告',也沒有聲明'$ outer_hash'。你的變量'$ outer_hash'被設置爲'%$ VAR1'的每個鍵,即'abc','def','mno',所以'$ outer_hash - > {$ match_key}'沒有意義 – Borodin