是否有map
的哈希等价物?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
我知道我可以循环使用钥匙。
答案 0 :(得分:16)
List::Pairwise声称要完全实现该语法 - 请参阅mapp
,grepp
。我没有用它。
此外,您可以将其作为
%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;