开发者

How do I map (and sort) values from a hash of hashes?

开发者 https://www.devze.com 2023-01-13 16:23 出处:网络
I have a hash of hashes, like so: %hash = ( a=> { b => 1, c =>2, d => 3}, a1 => { b => 11, c =>12, d => 13},

I have a hash of hashes, like so:

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

I want to extract the "b" element and put it into an array. Right now, I am looping through the hash to do this, but I think I can improve efficiency slightly by using map instead. I'm pretty sure that if this was an array of hashes, I'd use something like this:

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

Forgive me if I'm wrong, I'm still le开发者_C百科arning how map works. But what I'd like to know is how would I go about mapping the hash of hashes? Is this even possible using map? I have yet to find any examples of doing this.

Even better, the next step in this code is to sort the array once it's populated. I'm pretty sure this is possible, but I'm not smart enough on using map to figure it out myself. How would I go about doing this all in one shot?

Thanks. Seth


This extracts and sorts all "b"s:

my @array = sort { $a <=> $b } map $_->{b}, values %hash;


This fills @array with a sorted list of array references, each containing the value of b and the hashref it came from.

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

my @sorted_hashes = map {$$_[1]} @array;


Take your second solution, and substitute values %hash for @hasharray:

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

(And don’t forget the ; to terminate the statement.)

0

精彩评论

暂无评论...
验证码 换一张
取 消