perl - perl:同时使用 map 和 foreach?
问题描述
我想知道是否可以一次创建一个哈希分配它的键和值。或者在一般使用中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)
......换句话说,如何通过以下方式分配哈希:
- 仅 2 个数组(@keys、@values),无标量
- 一次(一行 - 无阻塞)
在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;
推荐阅读
- linux-kernel - 中断参数:设备树配置?
- java - JBoss EAP 7.1.6、CDI 1.2 和排除扫描不起作用
- python - 从命令行运行的程序,但不是从 pyinstaller 创建的可执行文件
- java - InaccessibleObjectException after migrating from Java 8 to Java 11
- python - 是否有随机图像生成的功能
- php - 无法从 php 运行 python 脚本
- yii2 - 自定义模型属性的验证错误未显示在表单中
- windows - Wireshark 无法加载自定义插件
- apache-spark - 使用 Spark 和 Elastic Search 时在 Kafka 中存储偏移的正确方法
- ffmpeg - ffmpeg 将传入的 RTP 音频仅流保存到文件