2010-06-02 16 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