代码之家  ›  专栏  ›  技术社区  ›  chris

perl:使用map从哈希中获取值

  •  1
  • chris  · 技术社区  · 15 年前

    看起来我应该能用地图做到这一点,但实际的细节让我捉摸不透。

    我在一个数组中有一个字符串列表,零或其中一个字符串可能有哈希值。

    因此,与其这样做:

    foreach $str ( @strings ) {
      $val = $hash{$str} if $hash{$str};
    }
    

    可以用地图替换为一行吗?

    4 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    8 年前

    当然,应该是:

    map { $val = $hash{$_} } @strings;
    

    也就是说,每个值 @strings 设置在 $_ 依次(而不是 $str 就像你的前臂)。

    当然,这没什么用,因为你没有做任何有价值的事情 $val 在您的循环中,我们不会捕获 map .

    如果您只是想生成一个值列表,那么应该是:

     @values = map { $hash{$_} } @strings;
    

    但使用哈希切片更简洁:

     @values = @hash{@strings};
    

    编辑:正如评论中指出的,如果可能的话 @弦乐 包含不是哈希中键的值,然后 @values 会得到那些位置的不死族。如果这不是你想要的,看 Hynek's answer 一个解决方案。

        2
  •  6
  •   Sinan Ünür    15 年前
    @values = grep { $_ } @hash{@strings};
    

    说明你只想 价值观。

    将此更改为

    @values = grep { defined } @hash{@strings};
    

    如果要跳过未定义的值。

        3
  •  3
  •   Hynek -Pichi- Vychodil Paulo Suassuna    15 年前

    我习惯这样做:

    @values = map { exists $hash{$_} ? $hash{$_} : () } @strings;
    

    但我看不出有什么问题

    push @values, $hash{$_} for grep exists $hash{$_}, @strings;
    

    @values = @hash{grep exists $hash{$_}, @strings};
    
        4
  •  1
  •   Sinan Ünür    15 年前
    map { defined $hash{$_} && ( $val =  $hash{$_})} @strings;