2013-09-06 27 views
6

私はフィルタリングする必要があるハッシュのハッシュを持っています。私はルックアップを行う方法を見つけましたが、それは私の質問に答えませんでした。perlでハッシュのハッシュをフィルタリングする

は、私はそのようなハッシュのハッシュを持って言う:

my %HoH = (
    flintstones => { 
     husband => "fred", 
     pal  => "barney", 
     town  => "springfield" 
    }, 
    jetsons => { 
     husband => "george", 
     wife  => "jane", 
     "his boy" => "elroy", 
    }, 
    simpsons => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
     town  => "springfield", 
    }, 
); 

私はスプリングフィールドからすべてのtownfolksをしたいと言うことができます。私はアウトサイダーなしで出力にハッシュの同じハッシュをしたい。

my %HoH = (
    flintstones => { 
     husband => "fred", 
     pal  => "barney", 
     town  => "springfield" 
    }, 
    simpsons => { 
     husband => "homer", 
     wife  => "marge", 
     kid  => "bart", 
     town  => "springfield", 
    }, 
); 

これは愚かなようですが、どのようにstrutureをフィルタリングするのか分かりません。フィルタリングの後、スプリングフィールドのすべての人々を反復することが目標です。

私は当然ながらいくつかの研究を行いました。私が訪れた最も近いものはハッシュスライスです。 しかし、彼らは恐ろしいようです。

答えて

10

あなたが削除したい要素の鍵を見つけるために最初の必要性:

grep { $HoH{$_}{town} eq 'springfield' } keys(%HoH) 

その後、あなたがそれらを削除します。

delete $HoH{$_} for grep { $HoH{$_}{town} eq 'springfield' } keys(%HoH); 

またはハッシュスライスを使用して:

delete @HoH{ grep { $HoH{$_}{town} eq 'springfield' } keys(%HoH) }; 
+1

を使用します'keys%HoH')をハッシュリファレンスとして使用します。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot、固定。 – ikegami

+2

いつものように、私が取り組んでいた解決策よりもきれいで洗練されています。私はあなたがあなたの睡眠にこのようなものを書くことができると思います。 – ThisSuitIsBlackNot

4

ハッシュを使用してgrepまたはmapにする必要がある場合は、 greppまたはmappList::Pairwiseから使用してください。利点は、元のハッシュ変数をgrep/mapコードブロックには言及する必要がなくなり、より機能的になります。だからあなたの問題は、このように解決することができます。

use List::Pairwise qw(grepp); 
%HoH = grepp { $b->{town} eq 'springfield' } %HoH; # $a is the current key, $b is the current value 
0
for my $key (keys %HoH) { 
delete $HoH{$key} if(!$HoH{$key}{town}); 
        (OR) 
delete $HoH{$key} if($HoH{$key}{town} !~ m/springfield/); 
} 

は( `grep`あなたは、文字列を処理しているでは削除オプション、あなたの答えを得るでしょうのいずれか...

関連する問題