[英]perl: Use map and foreach at once?
我想知道是否有可能同時分配其鍵和值的散列。 或者通常使用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中甚至可能嗎?
填充散列只是用交替的鍵和值分配列表的問題,因此您只需以交替的方式使用兩個數組構造列表。
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;
但實際上使用切片分配更容易。 盡管從技術上講,您不能在與聲明相同的語句中執行此操作,但它是迄今為止最簡潔的選項:
my %h;
@h{@keys} = @values;
使用List::MoreUtils 'zip'
或添加您自己的模塊,因為該模塊不是核心模塊:
sub zip(\@@){map{($_[0][$_-1],$_[$_])}1..@{$_[0]}}
my %h = zip @keys, @values;
嗯,問題不是很清楚“為什么?” -- 同樣可以通過以下代碼實現
use strict;
use warnings;
use Data::Dumper;
my $debug = 1;
my %h;
@h{qw(a b c)} = (1..3);
print Dumper(\%h) if $debug;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.