2010-06-02 5 views
15

मैं इस तरह एक सरणी है जरूरत:पर्ल मानचित्र - arrayelement-> के रूप में एक हैश में एक सरणी मैप करने के लिए array_index

my @arr = ("Field3","Field1","Field2","Field5","Field4"); 

अब मैं नीचे, जहां /DoSomething/ जवाब बजे है की तरह के नक्शे का उपयोग की मांग की।

my %hash = map {$_ => **/DOSOMETHING/** } @arr 

अब मैं हैश की आवश्यकता होती है नीचे की तरह लग रहे करने के लिए:

 
Field3 => 0 
Field1 => 1 
Field2 => 2 
Field5 => 3 
Field4 => 4 

किसी भी मदद की?

उत्तर

21
%hash = map { $arr[$_] => $_ } 0..$#arr; 

print Dumper(\%hash) 
$VAR1 = { 
      'Field4' => 4, 
      'Field2' => 2, 
      'Field5' => 3, 
      'Field1' => 1, 
      'Field3' => 0 
     }; 
19
my %hash; 
@hash{@arr} = 0..$#arr; 
+1

अच्छा एक। पर्ल मुझे इतने सालों के बाद आश्चर्यचकित करता है :) – unbeli

+3

यह शर्म की बात है कि '% हैश' को पूर्व घोषित किया जाना है, इसलिए हम 'my @hash {@arr} = 0 .. $ # arr जैसे कुछ नहीं लिख सकते हैं; ' – Zaid

+4

@Zaid हमेशा \\ $ _ {@ arr} = 0 .. $ # arr \ my% हैश के लिए प्यारा चाल है; ', लेकिन यूजीन के कोड में कम सदमे का मूल्य है। –

2

पर्ल 5.12 और बाद आप अपने सूचकांक/मान युग्म से अधिक पुनरावृति करने के लिए एक सरणी पर each उपयोग कर सकते हैं:

use 5.012; 

my %hash; 

while(my ($index, $value) = each @arr) { 
    $hash{$value} = $index; 
} 
3

यहाँ एक और तरह से मैं यह पूरा करने के बारे में सोच सकते हैं:

sub get_bumper { 
    my $i = 0; 
    sub { $i++ }; 
} 

my $bump = get_bumper;   # $bump is a closure with its very own counter 
map { $_ => $bump->(); } @arr; 

बहुत सी बातें है कि आप पर्ल में क्या कर सकते हैं के साथ के रूप में: ऐसा मत करो इस। :) यदि आपको मानने के लिए आवश्यक मानों का अनुक्रम अधिक जटिल है (उदाहरण के लिए 0, 1, 4, 9, 16 ... या यादृच्छिक संख्याओं का अनुक्रम, या पाइप से पढ़ने वाली संख्या), तो इस दृष्टिकोण को अनुकूलित करना आसान है यह, लेकिन आमतौर पर unbeli's approach का उपयोग करना आसान है। इस विधि का एकमात्र लाभ यह है कि यह आपको संख्याओं के मनमानी आलसी अनुक्रम प्रदान करने और उपभोग करने का एक अच्छा साफ तरीका प्रदान करता है: एक फ़ंक्शन जिसे कॉलर-निर्दिष्ट अनुक्रमों की आवश्यकता होती है, केवल पैरामीटर के रूप में कोडेफ ले सकता है, और इसे बार-बार कॉल कर सकता है संख्या प्राप्त करें।

+2

क्यों न केवल 'मेरा $ i; मेरा% हैश = मानचित्र {$ _ => $ i ++} @ arr' –

+0

@eugeney: हाँ, यह बहुत आसान है :) –

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