Perl中散列Map

wlzqhblo  于 2022-11-15  发布在  Perl
关注(0)|答案(6)|浏览(102)

map是否有哈希等价项?

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

我知道我可以循环调用这些键。

wnvonmuf

wnvonmuf1#

List::Pairwise声称完全实现了该语法--请参见mappgrepp。但我还没有使用过它。
此外,您还可以按照

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

我承认如果%hash真的是$deeply->{buried}->{hash}的话看起来比较笨拙。

erhoui1w

erhoui1w2#

我真的不明白你在这里想做什么。“map的hash等价物“到底是什么意思?你可以在hash上使用map。如果你想要密钥,就使用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创建一组对:

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

我需要看到一个例子,你会想用这个做什么,但到目前为止,我可以看到零理由使用一些大的旧模块,而不是基本的Perl。

tgabmvqs

tgabmvqs3#

你可以这样使用Map:

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

fcwjkofz4#

你可以使用我的模块List::Gen中的mapn来完成这个任务:

use List::Gen 'mapn';

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

mapn类似于map,只是它需要一个额外的参数,即遍历列表所依据的元素数。在块内部,@_数组被设置为当前切片。

icomxhvb

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'
        };
vh0rcniy

vh0rcniy6#

从perl 5.20开始,核心实用程序List::Util::pairmap就可以做到这一点:

use List::Util qw(pairmap);

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

这不一定是最优的(因为它涉及到将散列展开到一个列表并返回),但我相信这是vanilla perl中最短的方法。

相关问题