2010-07-20 11 views
5

में एक बहु मूल्य हैश पीछे मैं एक हैश है कि इस तरह दिखता है। क्या मुझे किसी भी तरह रिवर्स फ़ंक्शन का उपयोग करने की ज़रूरत है?पर्ल

नोट: मैं हमेशा मूल हैश के माध्यम से पुन: प्रयास कर सकता हूं और नए हैश के अनुसार चाबियाँ और मूल्यों को आवंटित कर सकता हूं, अखरोट मैं जानना चाहता था कि क्या कोई मामूली तरीका था।

+0

मुझे लगता है कि आपको हमारे उत्तरों में से एक स्वीकार करना चाहिए। आप Kinopiko के एक लाइनर से slicker कैसे प्राप्त कर सकते हैं? – masonk

उत्तर

6

एक चालाक तरीके की आवश्यकता नहीं है:

my %h = (
    bmw  => { id => 1, color => "brown" } , 
    mercedes => { id => 2, color => "black" } 
); 
my %j = map { ($h{$_}{id} => $_) } keys %h; 

for (keys %j) { 
    print "$_ $j{$_}\n"; 
} 

आउटपुट:

 
$ ./silly.pl 
1 bmw 
2 mercedes 
+0

अरे, आपके समाधान पर उतरने की कोई आवश्यकता नहीं है। आपका रास्ता मेरे लिए बहुत हल्का दिखता है :)। – masonk

+0

हालांकि यह सामान्य तरीका है। –

+0

मुझे लगता है कि हमारे पास "slick" – masonk

2

क्या आप पोस्ट किया है वैध पर्ल नहीं है, लेकिन मुझे लगता है कि मैं अपने अर्थ ले। ऐसा करने का एक आसान तरीका hash slice और एक मानचित्र के साथ होगा।

my %hash = (
    bmw  => { id => 1, color => 'brown' }, 
    mercedes => { id => 2, color => 'black' }, 
); 
my %new_hash; 
@new_hash{ map { $_->{id} } values %hash } = keys %hash; 
+0

की विभिन्न परिभाषाएं हैं, उपनाम (@) प्रतीक new_hash से पहले अंतिम पंक्ति पर क्यों उपयोग किया जाता है? – syker

+0

@syker: कृपया "हैश स्लाइस" के बारे में प्रदान किए गए लिंक मेसनक को देखें। –

+0

यह हैश स्लाइस (ऊपर लिंक) के लिए विशेष वाक्यविन्यास है। आप बाएं हाथ की चाबियों की एक सूची और दाईं ओर मूल्यों की एक सूची प्रदान करते हैं। पर्ल गारंटी देता है कि जिस क्रम में% हैश मान लौटाया जाता है वह वही क्रम है जिसमें कुंजी% हैश वापस लौटाया जाता है, इसलिए यह काम करता है। – masonk