在Perl中散列哈希的地图

时间:2011-04-24 07:46:31

标签: perl hash higher-order-functions

是否有map的哈希等价物?

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

我知道我可以循环使用钥匙。

6 个答案:

答案 0 :(得分:16)

List::Pairwise声称要完全实现该语法 - 请参阅mappgrepp。我没有用它。

此外,您可以将其作为

%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash; 
如果%hash真的是$deeply->{buried}->{hash},我承认看起来很笨拙。在这种情况下,我更喜欢使用$temp = ...; map {...} keys %$temp

答案 1 :(得分:7)

我真的看不到你在这里想做什么。什么“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的原因是零。

答案 2 :(得分:6)

你可以使用这样的地图:

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

答案 3 :(得分:3)

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

use List::Gen 'mapn';

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

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

答案 4 :(得分: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'
        };

答案 5 :(得分:0)

我添加了这个,因为我不允许在@eugene解决方案中添加评论。 我喜欢它,但它对我不起作用(在print $i中添加map以查看值变为NaN) 它的工作原理如下:

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