6

次のように、ハッシュのハッシュがあります。

%hash = ( a => { b => 1, c =>2, d => 3},
          a1 => { b => 11, c =>12, d => 13},
          a2 => { b => 21, c =>22, d => 23} )

「b」要素を抽出して配列に入れたい。現在、これを行うためにハッシュをループしていますが、代わりにマップを使用することで効率を少し改善できると思います。これがハッシュの配列である場合、次のようなものを使用すると確信しています。

@hasharray = ( { b => 1, c =>2, d => 3},
               { b => 11, c =>12, d => 13},
               { b => 21, c =>22, d => 23} )
@array = マップ { ($_->{b} => $_) } @hasharray

私が間違っていたら許してください。私はまだマップの仕組みを学んでいます。しかし、私が知りたいのは、ハッシュのハッシュをマッピングするにはどうすればよいですか? これはマップを使用しても可能ですか?これを行う例をまだ見つけていません。

さらに良いことに、このコードの次のステップは、データが取り込まれた配列をソートすることです。私はこれが可能であると確信していますが、マップを使用して自分でそれを理解するほど賢くありません. これをすべて一発で行うにはどうすればよいですか?

ありがとう。セス

4

3 に答える 3

11

これは、すべての「b」を抽出してソートします。

my @array = sort { $a <=> $b } map $_->{b}, values %hash;
于 2010-08-27T15:03:11.617 に答える
3

これは@array、配列参照のソートされたリストで満たされ、それぞれがの値bとそれが由来するハッシュリファレンスを含みます。

my @array = sort {$$a[0] <=> $$b[0]}
            map  { [$$_{b} => $_] } 
            values %hash;

my @sorted_hashes = map {$$_[1]} @array;
于 2010-08-27T15:05:24.047 に答える
1

values %hash2 番目のソリューションを使用して、次のように置き換えます@hasharray

@array = map { ($_->{b} => $_) } values %hash;

;(ステートメントを終了する を忘れないでください。)

于 2010-08-27T14:58:20.723 に答える