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。
第二个返回的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)
因为它们分隔了表达式,所以现在第一个map只0..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)。