perl:一次使用map和foreach吗?

时间:2019-12-02 23:16:38

标签: perl

我想知道是否可以通过散列来一次分配其键和值。或者通常在一行中使用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中甚至有可能吗?

3 个答案:

答案 0 :(得分:9)

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

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;

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

use strict;
use warnings;

use Data::Dumper;

my $debug = 1;

my %h;

@h{qw(a b c)} = (1..3);

print Dumper(\%h) if $debug;