Perl映射 - 需要将数组映射到散列为arrayelement-> array_index

时间:2010-06-02 13:04:08

标签: perl arrays hash mapping

我有一个这样的数组:

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

现在我使用下面的地图,其中 / DOSOMETHING / 是我正在寻找的答案。

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

现在我要求哈希看起来如下:

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

任何帮助?

4 个答案:

答案 0 :(得分:24)

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

print Dumper(\%hash)
$VAR1 = {
          'Field4' => 4,
          'Field2' => 2,
          'Field5' => 3,
          'Field1' => 1,
          'Field3' => 0
        };

答案 1 :(得分:19)

my %hash;
@hash{@arr} = 0..$#arr;

答案 2 :(得分: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更容易。这种方法的唯一优点是它为你提供了一种很好的干净方式来提供和使用任意懒惰的数字序列:一个需要调用者指定的数字序列的函数只需要将coderef作为参数,并重复调用它得到数字。

答案 3 :(得分:2)

在Perl 5.12及更高版本中,您可以在数组上使用each来迭代其索引/值对:

use 5.012;

my %hash;

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