Ответ 1
%hash = map { $arr[$_] => $_ } 0..$#arr;
print Dumper(\%hash)
$VAR1 = {
'Field4' => 4,
'Field2' => 2,
'Field5' => 3,
'Field1' => 1,
'Field3' => 0
};
У меня есть такой массив:
my @arr = ("Field3","Field1","Field2","Field5","Field4");
Теперь я использую карту, как показано ниже, где /DOSOMETHING/ - это ответ, который я ищу.
my %hash = map {$_ => **/DOSOMETHING/** } @arr
Теперь я требую, чтобы хеш выглядел следующим образом:
Field3 => 0 Field1 => 1 Field2 => 2 Field5 => 3 Field4 => 4
Любая помощь?
%hash = map { $arr[$_] => $_ } 0..$#arr;
print Dumper(\%hash)
$VAR1 = {
'Field4' => 4,
'Field2' => 2,
'Field5' => 3,
'Field1' => 1,
'Field3' => 0
};
my %hash;
@hash{@arr} = 0..$#arr;
Вот еще один способ, который я могу придумать для этого:
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 в качестве параметра и называть ее повторно получите числа.
В Perl 5.12 и более поздних версиях вы можете использовать each
в массиве для итерации по его парам индексов/значений:
use 5.012;
my %hash;
while(my ($index, $value) = each @arr) {
$hash{$value} = $index;
}