比较和编辑哈希中的底层结构

时间:2012-10-01 13:37:22

标签: perl search hash structure

我有一个复杂结构的哈希,我想执行搜索和替换。第一个哈希值如下:

$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"] },
}

因此删除基于子结构,而不是索引。怎么做到呢?谢谢你的帮助!!

让我们假设我将声明要保留的值,即我将保留456 => [“ab”,“cd”,“ef”]基于[“ab”,“cd”,“ef”]的预先声明的值,并删除任何其他地方的任何其他456实例。搜索必须是每个键。所以代码将通过哈希,首先采用123 => [“xx”,“yy”,“zy”]并将其与散列其余部分中的键进行比较,如果未找到匹配项,则不执行任何操作。如果找到匹配,例如456 =>的情况。 [“ab”,“cd”,“ef”],它会比较两者,正如我所说的那样,如果匹配,则会保留[“ab”,“cd”,“ef”]的那个,它会保持456 => [“ab”,“cd”,“ef”]并丢弃散列中任何其他位置的456的任何其他实例,即它将删除456 =>在这种情况下[“as”,“sd”,“df”]。

1 个答案:

答案 0 :(得分: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