perl

2013-09-06 6 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", 
    }, 
); 

यह मूर्खतापूर्ण लगता है लेकिन यह पता नहीं लगा सकता कि कैसे स्ट्रेट को फ़िल्टर किया जाए। लक्ष्य फ़िल्टरिंग के बाद स्प्रिंगफील्ड के सभी लोगों पर फिर से शुरू किया जाएगा।

मैंने निश्चित रूप से कुछ शोध किया और मैंने जो निकटतम चीज़ आई, वह हैश स्लाइस है। लेकिन वे डरावने लगते हैं।

उत्तर

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

'grep' इलाज कर रहे हैं तार में (का प्रयोग करें 'कुंजी% होह') हैशफ के रूप में। – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot, फिक्स्ड। – ikegami

+2

हमेशा के रूप में, समाधान के मुकाबले क्लीनर और अधिक सुरुचिपूर्ण मैं काम कर रहा था। मुझे कल्पना है कि आप इस सामान को अपनी नींद में लिख सकते हैं। – ThisSuitIsBlackNot

4

यदि आपको हैश के माध्यम से grep या map की आवश्यकता है, तो आप इस पर विचार कर सकते हैं या mappList::Pairwise से उपयोग करें। लाभ यह है कि grep/map code block में मूल हैश वैरिएबल का उल्लेख करने की आवश्यकता नहीं है, इसे और अधिक "कार्यात्मक" बनाते हैं। तो आपकी समस्या को इस तरह हल किया जा सकता:

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

हटाएं विकल्प में से किसी एक आप अपने जवाब मिल जाएगा ...

 संबंधित मुद्दे