22

是否有等效的哈希map

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

我知道我可以遍历这些键。

4

5 回答 5

21

List::Pairwise声称完全实现了该语法——参见mapp, grepp. 不过我没用过。

此外,你可以这样做

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

我承认如果%hash真的是$deeply->{buried}->{hash}. 我更喜欢$temp = ...; map {...} keys %$temp在这种情况下使用。

于 2011-04-24T08:13:24.417 回答
11

我真的看不出你在这里想做什么。“等效于 ” 的哈希值map是什么意思?你可以map在哈希上使用就好了。如果你想要钥匙,只需使用keys; 例如”

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

虽然通常

say "value of $_ is $hash{$_}"  keys %hash;

很好。

如果你想要两者,那么使用整个哈希。

对于作业,有什么问题%new_hash = %old_hash

你有深拷贝问题吗?然后使用Storable::dclone.

你想同时在闭包中同时使用键和值吗?然后用第一张地图做一堆对:

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

我需要看一个你想用这个做什么的例子,但到目前为止,我可以看到零原因使用一些大的旧模块而不是基本的 Perl。

于 2011-04-24T18:56:15.547 回答
6

您可以像这样使用地图:

my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
于 2011-04-24T08:13:50.767 回答
4

您可以使用mapn我的模块List::Gen来执行此操作:

use List::Gen 'mapn';

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

mapn类似于 map,除了它需要一个额外的参数,即遍历列表的元素数量。在块内部,@_数组被设置为当前切片。

于 2011-04-24T17:06:18.113 回答
3

$ 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'
        };
于 2012-10-12T12:01:20.797 回答