Perl合并地图的结果

时间:2017-01-19 03:42:10

标签: perl

如何连接两个贴图的输出以形成单个平面阵列?

我试图用这个:

my $test = {'foo' => 
    [map {
        {'i'       => "$_",
        }
        } 0..1,
     map {
        {'j'       => "$_",
        }
        } 0..1],
};

为了达到这个目的的结果:

my $test = {'foo' => [
        {
            'i' => '0'
        },
        {
            'i' => '1'
        },
        {
            'j' => '0'
        },
        {
            'j' => '1'
        },
    ]}

但是,这就是我在$test中得到的内容:

{
    'foo' => [
        {
            'i' => '0'
        },
        {
            'i' => '1'
        },
        {
            'i' => 'HASH(0x7f90ad19cd30)'
        },
        {
            'i' => 'HASH(0x7f90ae200908)'
        }
    ]
};

看起来第二个map的结果会被第一个map迭代。

1 个答案:

答案 0 :(得分:4)

第二个map是第一个0..1,的输入列表的一部分。

括号可以修复

use warnings;
use strict;

use Data::Dump;

my $test = { 
    'foo' => [ 
        ( map { { i => $_ } } 0..1 ),
        ( map { { j => $_ } } 0..1 )
    ],  
};

dd($test);

打印

{ foo => [{ i => 0 }, { i => 1 }, { j => 0 }, { j => 1 }] }

我删除了不需要的引号,如果/在您的申请中需要,请将其恢复。

在没有括号的情况下,使用逗号后的map来生成第一个map的输入列表的下一个元素,因此您实际拥有

map { i => $_ } (0..1, LIST);

考虑

my @arr = (
    map { { 'i', $_ } } 
        0..1, 
        qw(a b),
        map { ( { 'j', $_ } ) } 0..1
);
dd(\@arr);

打印

[
  { i => 0 },
  { i => 1 },
  { i => "a" },
  { i => "b" },
  { i => { j => 0 } },
  { i => { j => 1 } },
]

从输出中也可以看到这一点,其中所有键都是i(没有j s)。