2017-01-19 3 views
1

2つのマップの出力を連結して1つのフラットアレイを形成するにはどうすればよいですか?マップの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)' 
     } 
    ] 
}; 

2番目の結果のように見えますmap ge tsは最初にmapに反復されます。

答えて

4

第2の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); 

Itを考えてみましょうプリント

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

これもfすべてのキーがij)である出力を出力します。

関連する問題