指定された複数のキー以外のエントリをハッシュから削除する修行

ハッシュから指定されたキーのエントリを削除するのは delete で行える。削除するキーが複数、配列で渡されたとしたら foreach で回して delete すればよい。
では、削除しないキーを配列で渡されたらどうすればいいか。逆に言うと、指定されたキー以外のキーのエントリをすべて削除するにはどうすればいいか。

やってみた。

use strict;
use warnings;

my %table = do { my $i; map { $_ =>$i++ } qw/a b c d e f g h i j/; };

sub p {
    join(q{,}, sort do { my $x; grep { $_ } map { if ($x) { my $y="$x=>$_"; $x=0; $y; } else { $x=$_; 0; } } %table });
}

my @keeping = qw/c a f e/;

print "before:\t".p()."\n";
print "keeping keys:\t".join(q{,},@keeping)."\n";
my %keeping = map {$_ => 1} @keeping;
foreach my $key (keys %table) {
    if (! defined $keeping{$key}) {
        delete $table{$key};
    }
}
print "after:\t".p()."\n";

実行結果はこんな感じ。

before: a=>0,b=>1,c=>2,d=>3,e=>4,f=>5,g=>6,h=>7,i=>8,j=>9
keeping keys:   c,a,f,e
after:  a=>0,c=>2,e=>4,f=>5

おっけー。