map是否有哈希等价项?
map
my %new_hash = hash_map { new_key($a) => new_val($b) } %hash;
我知道我可以循环调用这些键。
wnvonmuf1#
List::Pairwise声称完全实现了该语法--请参见mapp,grepp。但我还没有使用过它。此外,您还可以按照
mapp
grepp
%new_hash = map { new_key($_) => new_value($hash{$_}) } keys %hash;
我承认如果%hash真的是$deeply->{buried}->{hash}的话看起来比较笨拙。
%hash
$deeply->{buried}->{hash}
erhoui1w2#
我真的不明白你在这里想做什么。“map的hash等价物“到底是什么意思?你可以在hash上使用map。如果你想要密钥,就使用keys;例如”
keys
@msglist = map { "value of $_ is $hash{$_}" } keys %hash
尽管通常
say "value of $_ is $hash{$_}" keys %hash;
就可以了。如果你想两者都要,那么就使用整个哈希。对于赋值,%new_hash = %old_hash有什么问题?您是否有深层复制问题?那么使用Storable::dclone。你想在闭包中同时使用key和value吗?然后用第一个map创建一组对:
%new_hash = %old_hash
Storable::dclone
@pairlist = map { [ $_ => $hash{$_} ] } keys %hash
我需要看到一个例子,你会想用这个做什么,但到目前为止,我可以看到零理由使用一些大的旧模块,而不是基本的Perl。
tgabmvqs3#
你可以这样使用Map:
my $i = 0; my %new_hash = map { $i ^= 1 ? new_key($_) : new_val($_) } %hash;
fcwjkofz4#
你可以使用我的模块List::Gen中的mapn来完成这个任务:
mapn
use List::Gen 'mapn'; my %new_hash = mapn {new_key($_[0]) => new_value($_[1])} 2 => %old_hash;
mapn类似于map,只是它需要一个额外的参数,即遍历列表所依据的元素数。在块内部,@_数组被设置为当前切片。
@_
icomxhvb5#
$ perl -d /设备/空
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' };
vh0rcniy6#
从perl 5.20开始,核心实用程序List::Util::pairmap就可以做到这一点:
List::Util::pairmap
use List::Util qw(pairmap); my %new_hash = pairmap { new_key($a) => new_val($b) } %hash;
这不一定是最优的(因为它涉及到将散列展开到一个列表并返回),但我相信这是vanilla perl中最短的方法。
6条答案
按热度按时间wnvonmuf1#
List::Pairwise声称完全实现了该语法--请参见
mapp
,grepp
。但我还没有使用过它。此外,您还可以按照
我承认如果
%hash
真的是$deeply->{buried}->{hash}
的话看起来比较笨拙。erhoui1w2#
我真的不明白你在这里想做什么。“
map
的hash等价物“到底是什么意思?你可以在hash上使用map
。如果你想要密钥,就使用keys
;例如”尽管通常
就可以了。
如果你想两者都要,那么就使用整个哈希。
对于赋值,
%new_hash = %old_hash
有什么问题?您是否有深层复制问题?那么使用
Storable::dclone
。你想在闭包中同时使用key和value吗?然后用第一个map创建一组对:
我需要看到一个例子,你会想用这个做什么,但到目前为止,我可以看到零理由使用一些大的旧模块,而不是基本的Perl。
tgabmvqs3#
你可以这样使用Map:
fcwjkofz4#
你可以使用我的模块List::Gen中的
mapn
来完成这个任务:mapn
类似于map,只是它需要一个额外的参数,即遍历列表所依据的元素数。在块内部,@_
数组被设置为当前切片。icomxhvb5#
$ perl -d /设备/空
例如,要反转键和值:
vh0rcniy6#
从perl 5.20开始,核心实用程序
List::Util::pairmap
就可以做到这一点:这不一定是最优的(因为它涉及到将散列展开到一个列表并返回),但我相信这是vanilla perl中最短的方法。