Существует ли хэш-эквивалент для map
?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
Я знаю, что я мог бы перебирать ключи.
Существует ли хэш-эквивалент для map
?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
Я знаю, что я мог бы перебирать ключи.
List:: Pairwise утверждает, что реализует именно этот синтаксис - см. mapp
, grepp
. Однако я его не использовал.
Кроме того, вы можете сделать это как
%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash;
который я допускаю, выглядит более неуклюже, если %hash
действительно является $deeply->{buried}->{hash}
. Я предпочитаю использовать $temp = ...; map {...} keys %$temp
в таких случаях.
Вы можете использовать такую карту:
my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
Я действительно не могу понять, что вы пытаетесь сделать здесь. Что означает "эквивалент хэша для 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.
Вы можете использовать mapn
из моего модуля List:: Gen, чтобы сделать это:
use List::Gen 'mapn';
my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;
mapn
похож на карту, за исключением того, что он принимает дополнительный аргумент, количество элементов для перемещения по списку. Внутри блока массив @_
установлен на текущий срез.
$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'
};
Я добавляю это, потому что мне не разрешено добавлять комментарии к решению @eugene.
Мне это нравится, но это не сработало для меня (добавьте print $i
в map
, чтобы увидеть, что значение становится NaN
)
он работал следующим образом:
my $i = 0;
%hash = map { ($i=($i^1)+0) ? new_key($_) : new_val($_) } %hash;