2013-09-06 32 views
6

Tôi có một băm băm mà tôi cần phải lọc. Tôi đã tìm cách tìm kiếm nhưng nó không trả lời được câu hỏi của tôi.Lọc một băm băm trong perl

Nói rằng tôi có một băm của băm như thế:

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", 
    }, 
); 

tôi cho phép nói rằng tôi muốn tất cả các townfolks từ springfield. Tôi muốn băm cùng của băm trong đầu ra mà không có người ngoài.

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

Có vẻ ngớ ngẩn nhưng không thể tìm ra cách lọc thanh chống. Mục tiêu sẽ là lặp lại trên tất cả mọi người của springfield sau khi lọc.

Tôi tất nhiên đã làm một số nghiên cứu và điều gần nhất tôi đến là băm lát. Nhưng chúng có vẻ đáng sợ.

Trả lời

10

Trước tiên bạn cần phải tìm ra chìa khóa của các yếu tố bạn muốn loại bỏ:

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

Sau đó, bạn xóa chúng:

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

Hoặc sử dụng một lát băm:

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

Trong hộp thoại 'chuỗi grep' bạn đang điều trị ('keys% HoH') dưới dạng hashrefs. – ThisSuitIsBlackNot

+0

@ ThisSuitIsBlackNot, Fixed. – ikegami

+2

Như mọi khi, sạch hơn và thanh lịch hơn so với giải pháp tôi đang làm. Tôi tưởng tượng bạn có thể viết những thứ này trong giấc ngủ của bạn. – ThisSuitIsBlackNot

4

Nếu bạn cần grep hoặc map thông qua băm, thì bạn có thể cân nhắc sử dụng grepp hoặc mapp từ List::Pairwise. Lợi thế là không cần phải đề cập đến biến băm ban đầu nữa trong khối mã grep/map, làm cho nó trở nên "chức năng" hơn. Vì vậy, vấn đề của bạn có thể được giải quyết như thế này:

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/); 
} 

Sử dụng bất kỳ một trong những tùy chọn xóa bạn sẽ nhận được câu trả lời của bạn ...

Các vấn đề liên quan