我有一个复杂结构的哈希,我想执行搜索和替换。第一个哈希值如下:
$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”]。
答案 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。