【问题标题】:map for hashes in PerlPerl 中的哈希映射
【发布时间】:2011-08-11 18:41:23
【问题描述】:

map 是否有等效的哈希值?

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

我知道我可以遍历这些键。

【问题讨论】:

    标签: perl hash higher-order-functions


    【解决方案1】:

    List::Pairwise 声称完全实现了该语法——参见mappgrepp。不过我没用过。

    另外,你可以这样做

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

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

    【讨论】:

    • 您正在分配一个哈希值。假设我想创建一个传递给函数的哈希映射引用 ({ something => 42 })。结果似乎是一个数组。如果我将结果分配给一个标量,我会得到一个 HASH ref,但是当我打印它(没有分配)时,我会得到一个 ARRAY。或许可以更详细地解释一下。
    【解决方案2】:

    你可以像这样使用地图:

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

    【讨论】:

    • 对不起,我的例子只是一个特例。我希望 new_keynew_val 成为键和值的函数。 (不过,这回答了我提出的问题。)
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢,这更笼统。
    【解决方案4】:

    我真的看不出你在这里想要做什么。 “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。

    【讨论】:

    • 我正在寻找一种更优雅的替代方法来使用 keysList::PairwiseList::Gen,如建议的那样,提供此类。从来没有遇到过任何分配问题,所以这可能是一个误解。至于何时值得使用模块来简化程序,我想这是一个品味问题。
    • @Tim: List::Gen 似乎有点有趣,但我一辈子都想不出为什么有人会使用 List::Pairwise,因为它以 @Tim 的方式隐藏了正在发生的事情987654332@ 非常明显。也就是说,我确实发现自己经常构建 ordered 对列表,我的意思是有序对的有序列表。
    【解决方案5】:

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

    【讨论】:

    • 从问题和其他答案中可以看出,我知道我可以遍历这些键。我正在寻找是否有其他解决方案。 (它是 List::Pairwise。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2016-08-04
    • 2012-01-31
    • 2018-10-13
    • 2017-12-23
    相关资源
    最近更新 更多