首页 > 解决方案 > perl:同时使用 map 和 foreach?

问题描述

我想知道是否可以一次创建一个哈希分配它的键和值。或者在一般使用中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)......换句话说,如何通过以下方式分配哈希:

在perl中甚至可能吗?

标签: perl

解决方案


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

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;

推荐阅读