2010-06-02 42 views

回答

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

不錯的一個。在這麼多年之後,perl讓我感到驚訝:) – unbeli 2010-06-02 13:37:09

+3

這是一種恥辱'%hash'必須預先聲明,所以我們不能寫'my @hash {@arr} = 0 .. $#arr; '... – Zaid 2010-06-02 13:38:43

+4

@Zaid總有一些可愛的技巧,例如'@ $ _ {@ arr} = 0 .. $#arr for \ my%hash;',但eugene的代碼具有較小的震動值。 – 2010-06-02 13:47:38

2

在Perl 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; 

對於很多事情,你可以 Perl的事:不要做 這個。 :)如果您需要分配的值序列更復雜(例如0,1,4,9,16 ...或一系列隨機數或從管道讀取的數字),則很容易將此方法適用於它,但它通常更容易使用unbeli's approach。這種方法的唯一優點是它提供了一個很好的乾淨方式來提供和使用任意的惰性數字序列:一個需要調用者指定的數字序列的函數可以將一個coderef作爲參數,並將其重複地調用獲得數字。

+2

爲什麼不只是'我$我; my%hash = map {$ _ => $ i ++} @ arr' – 2012-09-23 21:15:30

+0

@eugeney:是的,這簡單得多:) – 2012-09-23 21:19:45