簡體   English   中英

perl:一次使用 map 和 foreach?

[英]perl: Use map and foreach at once?

我想知道是否有可能同時分配其鍵和值的散列。 或者通常使用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中甚至可能嗎?

填充散列只是用交替的鍵和值分配列表的問題,因此您只需以交替的方式使用兩個數組構造列表。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM