【发布时间】:2011-08-11 18:41:23
【问题描述】:
map 是否有等效的哈希值?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
我知道我可以遍历这些键。
【问题讨论】:
标签: perl hash higher-order-functions
map 是否有等效的哈希值?
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
我知道我可以遍历这些键。
【问题讨论】:
标签: perl hash higher-order-functions
List::Pairwise 声称完全实现了该语法——参见mapp、grepp。不过我没用过。
另外,你可以这样做
%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash;
如果%hash 真的是$deeply->{buried}->{hash},我承认它看起来更笨拙。在这种情况下,我更喜欢使用$temp = ...; map {...} keys %$temp。
【讨论】:
{ something => 42 })。结果似乎是一个数组。如果我将结果分配给一个标量,我会得到一个 HASH ref,但是当我打印它(没有分配)时,我会得到一个 ARRAY。或许可以更详细地解释一下。
你可以像这样使用地图:
my $i = 0;
my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
【讨论】:
new_key 和 new_val 成为键和值的函数。 (不过,这回答了我提出的问题。)
您可以使用我的模块List::Gen 中的mapn 来执行此操作:
use List::Gen 'mapn';
my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;
mapn 类似于 map,除了它需要一个额外的参数,即遍历列表的元素数量。在块内部,@_ 数组被设置为当前切片。
【讨论】:
我真的看不出你在这里想要做什么。 “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。
【讨论】:
keys。 List::Pairwise 和 List::Gen,如建议的那样,提供此类。从来没有遇到过任何分配问题,所以这可能是一个误解。至于何时值得使用模块来简化程序,我想这是一个品味问题。
$ 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'
};
【讨论】: