指定された複数のキー以外のエントリをハッシュから削除する修行
ハッシュから指定されたキーのエントリを削除するのは 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
おっけー。