让我们假设我有两个哈希值。其中一个包含一组数据,只需要保留其他散列中显示的内容。如何根据另一个散列的键/值删除一个[sub]散列?
例如
my %hash1 = (
test1 => { inner1 => { more => "alpha", evenmore => "beta" } },
test2 => { inner2 => { more => "charlie", somethingelse => "delta" } },
test3 => { inner9999 => { ohlookmore => "golf", somethingelse => "foxtrot" } }
);
my %hash2 = (
major=> { test2 => "inner2",
test3 => "inner3" } );
我想要做的,是删除HASH1整个苏巴如果它不作为HASH2 {}大键/值存在,最好不模块。包含在“innerX”中的信息无关紧要,它只是单独存在(除非删除子哈希然后它可以消失)。
在上面这个操作后,预制HASH1会是什么样子的例子:
my %hash1 = (
test2 => { inner2 => { more => "charlie", somethingelse => "delta" } },
);
它删除HASH1 {} TEST1和HASH1 {} TEST3因为不匹配HASH2什么。
这是我目前尝试的,但它不起作用。也不是最安全的做法,因为我正在循环散列而试图从中删除。不过,我正在删除每个应该好吗?
这是我在做这样的尝试,但perl的抱怨:
不能使用字符串(“inner1”)作为HASH裁判而“严格裁判”在使用中
while(my ($test, $inner) = each %hash1)
{
if(exists $hash2{major}{$test}{$inner})
{
print "$test($inner) is in exists.\n";
}
else
{
print "Looks like $test($inner) does not exist, REMOVING.\n";
#not to sure if $inner is needed to remove the whole entry
delete ($hash1{$test}{$inner});
}
}
是否有可能得到这一行的解释: $ delete = 0,如果存在则为last $ hash2 {major} {$ k} && $ hash2 {major} {$ k} eq $ inner; 我有点理解它,但我真的被'''和'last用法抛弃了。 – Zack 2010-04-03 21:38:13
@Zack感谢您的选中标记!更新答案中提供的解释以及额外的奖励。 – 2010-04-03 23:42:05