Perl map - нужно сопоставить массив в хэш как 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

Любая помощь?

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 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. Единственное преимущество этого метода состоит в том, что он дает вам хороший чистый способ обеспечить и использовать произвольные ленивые последовательности чисел: функция, которая нуждается в указанной последовательности номеров, вызываемой вызывающим абонентом, может просто взять coderef в качестве параметра и называть ее повторно получите числа.

Ответ 4

В Perl 5.12 и более поздних версиях вы можете использовать each в массиве для итерации по его парам индексов/значений:

use 5.012;

my %hash;

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