Карта для хэшей в Perl
Существует ли хэш-эквивалент для map
?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
Я знаю, что я мог бы перебирать ключи.
Ответы
Ответ 1
List:: Pairwise утверждает, что реализует именно этот синтаксис - см. mapp
, grepp
. Однако я его не использовал.
Кроме того, вы можете сделать это как
%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash;
который я допускаю, выглядит более неуклюже, если %hash
действительно является $deeply->{buried}->{hash}
. Я предпочитаю использовать $temp = ...; map {...} keys %$temp
в таких случаях.
Ответ 2
Вы можете использовать такую карту:
my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
Ответ 3
Я действительно не могу понять, что вы пытаетесь сделать здесь. Что означает "эквивалент хэша для map
"? Вы можете использовать map
на хеше просто отлично. Если вы хотите использовать клавиши, просто используйте keys
; например,
@msglist = map { "value of $_ is $hash{$_}" } keys %hash
хотя обычно
say "значение $_ - это $hash {$ _}" ключи% hash;
просто отлично.
Если вы хотите обоим, используйте весь хэш.
Для назначения, что не так с %new_hash = %old_hash
?
У вас проблемы с глубоким копированием? Затем используйте Storable::dclone
.
Вы хотите, чтобы одновременно и ключ и значение были доступны в закрытии? Затем сделайте кучу пар с первой картой:
@pairlist = map { [ $_ => $hash{$_} ] } keys %hash
Мне нужно увидеть пример того, что вы хотели бы сделать с этим, но до сих пор я вижу нулевую причину использования какого-то большого старого модуля вместо базового Perl.
Ответ 4
Вы можете использовать mapn
из моего модуля List:: Gen, чтобы сделать это:
use List::Gen 'mapn';
my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;
mapn
похож на карту, за исключением того, что он принимает дополнительный аргумент, количество элементов для перемещения по списку. Внутри блока массив @_
установлен на текущий срез.
Ответ 5
$perl -d/dev/null
DB<2> %p = ( a=>'b', c=> 'd');
DB<5> p Dumper \%p
$VAR1 = {
'c' => 'd',
'a' => 'b'
};
К примеру. переверните ключ и значение:
DB<6> %q = map { ($p{$_}, $_ ) } keys %p
DB<7> p Dumper \%q
$VAR1 = {
'b' => 'a',
'd' => 'c'
};
Ответ 6
Я добавляю это, потому что мне не разрешено добавлять комментарии к решению @eugene.
Мне это нравится, но это не сработало для меня (добавьте print $i
в map
, чтобы увидеть, что значение становится NaN
)
он работал следующим образом:
my $i = 0;
%hash = map { ($i=($i^1)+0) ? new_key($_) : new_val($_) } %hash;