Perl合并地图结果

ohc*_*mel 1 perl dictionary list

如何连接两个地图的输出以形成单个平面数组?

我试图使用这个:

my $test = { 'foo' => [
    map { 
        { 'i' => "$_" } 
    } 0..1,
    map {
        { 'j' => "$_" }
    } 0..1
] };
Run Code Online (Sandbox Code Playgroud)

为了达到这样的结果:

my $test = {'foo' => [
        {
            'i' => '0'
        },
        {
            'i' => '1'
        },
        {
            'j' => '0'
        },
        {
            'j' => '1'
        },
    ]}
Run Code Online (Sandbox Code Playgroud)

然而,这是我得到的$test

{
    'foo' => [
        {
            'i' => '0'
        },
        {
            'i' => '1'
        },
        {
            'i' => 'HASH(0x7f90ad19cd30)'
        },
        {
            'i' => 'HASH(0x7f90ae200908)'
        }
    ]
};
Run Code Online (Sandbox Code Playgroud)

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

zdi*_*dim 5

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

括号可以解决这个问题

use warnings;
use strict;

use Data::Dump;

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

dd($test);
Run Code Online (Sandbox Code Playgroud)

因为它们分隔了表达式,所以现在第一个map0..1作为它的输入列表并计算并返回一个列表,然后与第二个map的返回列表合并。(严格来说,您只需要在第一个周围加上括号map。)

这打印

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

我已经删除了不需要的引号,如果/根据您的应用程序需要,请恢复它们。

如果没有括号,map逗号之后的表达式将作为第一个 生成输入列表的一部分map,因此在 之后0..1有效地生成输入列表的下一个元素

map { i => $_ } (0..1, LIST);
Run Code Online (Sandbox Code Playgroud)

考虑

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

它打印

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

这也可以从您的输出中看到,其中所有键都在i(没有js)。