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

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

假设我将声明要保留的值,即我将保留 456 => ["ab", "cd", "ef"] 基于预先声明的值 ["ab", "cd", " ef"] 并在其他任何地方删除 456 的任何其他实例。搜索必须针对每个键。因此代码将通过哈希,首先取 123 => ["xx", "yy", "zy"] 并将其与哈希其余部分的键进行比较,如果未找到匹配项,则不执行任何操作。如果找到匹配项,例如 456 => ["ab", "cd", "ef"],它将比较两者,正如我所说,在匹配的情况下,带有 [" ab", "cd", "ef"] 将保留,它将保留 456 => ["ab", "cd", "ef"

4

1 回答 1

0

这是一个使用智能匹配运算符执行数组比较的解决方案:

更新:正如 Borodin 指出的那样,我的原始代码是错误的。这是固定版本。

更新 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

于 2012-10-01T14:00:06.233 回答