Perl map - необходимо отобразить массив в хеш как arrayelement-> array_index - PullRequest
16 голосов
/ 02 июня 2010

У меня есть такой массив:

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

Теперь я использую карту, как показано ниже, где / DOSOMETHING / - это ответ, который я ищу.

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

Теперь мне нужно, чтобы хеш выглядел так, как показано ниже:

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

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

Ответы [ 4 ]

24 голосов
/ 02 июня 2010
%hash = map { $arr[$_] => $_ } 0..$#arr;

print Dumper(\%hash)
$VAR1 = {
          'Field4' => 4,
          'Field2' => 2,
          'Field5' => 3,
          'Field1' => 1,
          'Field3' => 0
        };
19 голосов
/ 02 июня 2010
my %hash;
@hash{@arr} = 0..$#arr;
3 голосов
/ 23 сентября 2012

Вот еще один способ, которым я могу придумать для достижения этой цели:

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 в качестве параметра и повторно вызывать его для получить номера.

2 голосов
/ 23 сентября 2012

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

use 5.012;

my %hash;

while(my ($index, $value) = each @arr) {
    $hash{$value} = $index;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...