карта для хэшей в Perl - PullRequest
       10

карта для хэшей в Perl

15 голосов
/ 24 апреля 2011

Есть ли хэш-эквивалент для map?

my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;

Я знаю, что могу перебрать ключи.

Ответы [ 6 ]

16 голосов
/ 24 апреля 2011

List :: Pairwise претендует на реализацию именно этого синтаксиса - см. mapp, grepp.Я не использовал это все же.

Кроме того, вы можете сделать это как

%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash; 

, что, я признаю, выглядит неуклюже, если %hash действительно $deeply->{buried}->{hash}.Я предпочитаю использовать $temp = ...; map {...} keys %$temp в таких случаях.

7 голосов
/ 24 апреля 2011

Я действительно не вижу, что вы пытаетесь сделать здесь. Что вообще означает «эквивалент хеша для map»? Вы можете использовать map для хеша просто отлично. Если вы хотите ключи, просто используйте keys; например "

@msglist = map { "value of $_ is $hash{$_}" } keys %hash    

хотя обычно

скажем "значение $ _ равно $ hash {$ _}" ключей% hash;

просто отлично.

Если вы хотите и то и другое, тогда используйте весь хэш.

Что касается задания, что не так с %new_hash = %old_hash?

У вас есть проблемы с глубоким копированием? Тогда используйте Storable::dclone.

Хотите ли вы, чтобы ключ и значение были доступны в закрытии одновременно? Затем составьте пару пар с первой картой:

@pairlist = map { [ $_ => $hash{$_} ] } keys %hash  

Мне нужно увидеть пример того, что вы хотели бы сделать с этим, но пока я вижу нулевую причину для использования какого-то большого старого модуля вместо базового Perl.

6 голосов
/ 24 апреля 2011

Вы можете использовать карту следующим образом:

my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
3 голосов
/ 12 октября 2012

$ 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'
        };
3 голосов
/ 24 апреля 2011

Вы можете использовать mapn из моего модуля List :: Gen , чтобы сделать это:

use List::Gen 'mapn';

my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;

mapn похоже на карту, но требует дополнительного аргументаколичество элементов, по которым можно пройти список.Внутри блока массив @_ устанавливается на текущий срез.

0 голосов
/ 05 ноября 2016

Я добавляю это, потому что я не могу добавлять комментарии к решению @eugene.Мне это нравится, но у меня это не сработало (добавьте print $i в map, чтобы увидеть, что значение становится NaN), это сработало так:

my $i = 0;
%hash = map { ($i=($i^1)+0) ? new_key($_) : new_val($_) } %hash;
...