2 つのハッシュがあるとします。そのうちの 1 つには、他のハッシュに現れるものを保持するだけでよいデータのセットが含まれています。
例えば
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" } );
私がしたいのは、できればモジュールなしで、hash2{major} のキー/値として存在しない場合、hash1 のサブハッシュ全体を削除することです。「innerX」に含まれる情報は重要ではなく、単にそのままにしておかなければなりません (サブハッシュを削除しない限り、それは消える可能性があります)。
上記の例では、この操作が実行された後、hash1 は次のようになります。
my %hash1 = (
test2 => { inner2 => { more => "charlie", somethingelse => "delta" } },
);
hash1{test1} と hash1{test3} は、hash2 と一致しないため削除します。
これが私が現在試したことですが、うまくいきません。また、ハッシュを削除しようとしているときにハッシュをループしているため、おそらく最も安全なことではありません。しかし、私は大丈夫なはずのそれぞれで削除していますか?
これは私の試みでしたが、perl は次のように不平を言っています。
"strict refs" が使用されている間は、文字列 ("inner1") を HASH ref として使用できません
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});
}
}