2011-04-24 47 views
13

是否有一个相当于map的哈希值?在Perl中的哈希映射

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

我知道我可以通过键循环。

回答

15

List::Pairwise声称完全实现该语法 - 请参阅mapp,grepp。我没有使用它。

此外,你可以做到这一点作为

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

这点我承认看起来笨拙,如果%hash确实是一个$deeply->{buried}->{hash}。在这种情况下,我更喜欢使用$temp = ...; map {...} keys %$temp

+1

'名单::成对:: mapp'作品大。 – Tim

5

您可以使用地图这样的:

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

对不起,我的例子只是一个特例。我想'new_key'和'new_val'是键和值的函数。 (这回答了我问的问题,但是。) – Tim

3

您可以使用mapn从我的模块List::Gen做到这一点:

use List::Gen 'mapn'; 

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

mapn就像是地图,但它需要一个额外的参数,要列表的元素的数量。在块内部,@_阵列被设置为当前片。

+0

谢谢,这更一般。 – Tim

5

我真的不明白你在这里要做什么。什么是“map的哈希等价物”甚至意味着什么?你可以在散列上使用map。如果你想要钥匙,只需使用keys;例如,”

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

虽然平时

说 “的$价值_为$哈希{$ _}” 键%哈希;

就好了

如果你想同时,然后用整个哈希。

对于分配,这有什么错%new_hash = %old_hash

您是否有深层复制问题?然后使用Storable::dclone

您是否希望在关闭时同时使用键和值?然后,让一帮对与第一地图:

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

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

+0

我正在寻找一个更优雅的替代方案来使用'keys'。正如建议的那样,List :: Pairwise和List :: Gen可以提供这样的功能。从来没有任何任务的麻烦,所以这可能是一个误会。至于什么时候使用模块来简化程序是值得的,我想这是一个有趣的问题。 – Tim

+0

@Tim:List :: Gen似乎有点有趣,但我不能为我的生活想到为什么有人会使用List :: Pairwise,因为它隐藏了发生了什么'map {“got $ _ = = > $ h {$ _}“}键%h'非常明显。也就是说,我确实发现自己经常构造*有序对列表,我的意思是有序列表的有序列表。 – tchrist

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' 
     }; 
+0

正如在问题和其他答案中所看到的,我知道我可以通过键循环。我期待着看看是否有另一种解决方案。 (这是List :: Pairwise。) – Tim

0

我加了这个,因为我不允许向@eugene解决方案添加注释。 我喜欢它,但它并没有为我工作(在map添加print $i地看到,值变为NaN) 它的工作是这样的:

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