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