2010-06-02 39 views
15

Böyle bir dizi var array_index arrayelement-> gibi bir karma içine bir dizi eşleştirmek için ihtiyacı: Şimdi ben aşağıda, /DoSomething/ cevap am nerede gibi harita kullanmakPerl haritası -

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

arayan.

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

Şimdi aşağıda gibi görünmek için karma gerektirir:

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

Herhangi bir yardım?

Perl 5.12 yılında

cevap

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

hoş biri. perl çok uzun yıllar sonra beni şaşırtıyor :) – unbeli

+3

Bu utanç '% hash' önceden bildirilmeli, bu yüzden '@hash {@arr} = 0 .. $ # arr; '... – Zaid

+4

@Zaid \ $% {@ arr} = 0 .. $ # arr \ my% hash; 'için her zaman sevimli püf noktaları vardır, ancak eugene'nin kodu daha az şok değerine sahiptir. –

2

ve daha sonra onun indeks/değer çiftleri üzerinde yineleme yapmayı dizisinde each kullanabilirsiniz:

use 5.012; 

my %hash; 

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

İşte bunu gerçekleştirmek için aklınıza gelebilecek bir yol daha var: Eğer Perl yapabileceğiniz çok şey olduğu gibi

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

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

: yapmayın bu. :) Atamanız gereken değerler dizisi daha karmaşıksa (örn. 0, 1, 4, 9, 16 ... veya bir dizi rasgele sayı veya bir borudan okunan rakamlar), bu yaklaşımı Bu, ancak unbeli's approach'u kullanmanın genellikle daha kolay. Bu yöntemin tek avantajı, sayıların rasgele tembel dizilerinin sağlanması ve tüketilmesi için güzel ve temiz bir yol sağlamasıdır: arayanın belirtilen bir dizi sırasına ihtiyaç duyan bir işlev, bir coderef'i parametre olarak alabilir ve tekrar tekrar sayıları al.

+2

Neden sadece benim $ i değil; benim% hash = map {$ _ => $ i ++} @ arr ' –

+0

@eugeney: Evet, bu daha basit :) –