【问题标题】:perl: Use map and foreach at once?perl:同时使用 map 和 foreach?
【发布时间】:2019-12-02 23:16:38
【问题描述】:

我想知道是否可以一次创建一个哈希来分配它的键和值。或者一般在一行中使用mapfor

#!/usr/bin/perl
%h = map {$_, $i} qw[a b c] for $i (1..3)

但不幸的是不是 => Number found where operator expected,表示括号中的数字。所以我的问题是为什么我不能通过这种方式制作双循环?以及如何将哈希键分配给值(我不关心$h = {a=>1,b=>2,c=>3}之类的东西,而是分配%h = (@keys = @values) ...换句话说,如何通过以下方式分配哈希:

  • 只有 2 个数组(@keys、@values),没有标量
  • 一次(一行 - 无阻塞)

在 perl 中甚至可以吗?

【问题讨论】:

  • 总是use strict; use warnings;

标签: perl


【解决方案1】:

填充散列只是简单地分配具有交替键和值的列表,因此您只需要以交替的方式使用两个数组来构造列表。

use strict;
use warnings;
my @keys = qw(a b c);
my @values = 1..3;

my %h = map { ($keys[$_], $values[$_]) } 0..$#keys;

List::UtilsBy 在 zip_by 中为此提供了一个有用的抽象。

use List::UtilsBy 'zip_by';
my %h = zip_by { @_ } \@keys, \@values;

但实际上使用slice assignment 更容易。尽管从技术上讲,您不能在与声明相同的语句中执行此操作,但它是迄今为止最简洁的选择:

my %h;
@h{@keys} = @values;

【讨论】:

  • ($keys[$_], $values[$_]) 通常写成$keys[$_] => $values[$_](虽然这只是一个风格问题)
  • FWIW,我在返回对的 map 语句中使用括号作为一种习惯,以避免解析器混淆并将其视为 map EXPR,尽管这当然并不总是必要的。
  • @$_{@keys} = @values for \my %h; 但总体思路不好。
【解决方案2】:

使用List::MoreUtils 'zip' 或添加您自己的,因为该模块不是核心模块:

sub zip(\@@){map{($_[0][$_-1],$_[$_])}1..@{$_[0]}}                 
my %h = zip @keys, @values;

【讨论】:

    【解决方案3】:

    嗯,关于“为什么?”的问题不是很清楚。 -- 也可以用下面的代码实现

    use strict;
    use warnings;
    
    use Data::Dumper;
    
    my $debug = 1;
    
    my %h;
    
    @h{qw(a b c)} = (1..3);
    
    print Dumper(\%h) if $debug;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 2016-12-20
      • 2014-10-18
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多