sorting - How do I sort a perl hash by multiple keys? -


hi have data structure of following form:

$data = {                                                                                                'a' => { key1 => 2, key2 => 1 },                                                                        'b' => { key1 => 1, key2 => 2 },                                                                        'c' => { key1 => 1, key2 => 1 },                                                                        'd' => { key1 => 3, key2 => 2 },                                                                        'e' => { key1 => 3, key2 => 1 },                                                                        'f' => { key1 => 1, key2 => 2 },                                                                    }; 

what want able loop through data structure in ascending order of key2, descending order of key1, , ascending order of hash key, e.g:

e c d b f 

how can achieve in perl? know can sort hash key using sort keys %$data, how can sort multiple values , keys?

a similar question has been asked before , can found here: sorting array of hash multiple keys perl

basically, perl has 2 operators sorting, <=> , cmp return -1, 0 or 1, depending on if left hand side less than, equal to, or greater right hand side. <=> used numerical comparison, , cmp used stringwise comparison. more detail use can found here: equality operators.

these operators can used perl's sort function , in conjuction or operator can used achieve result you're after:

#!/usr/bin/perl  use strict; use warnings;  $data = {     'a' => { key1 => 2, key2 => 1 },     'b' => { key1 => 1, key2 => 2 },     'c' => { key1 => 1, key2 => 1 },     'd' => { key1 => 3, key2 => 2 },     'e' => { key1 => 3, key2 => 1 },     'f' => { key1 => 1, key2 => 2 }, };  @sorted = sort {         $data->{$a}->{key2} <=> $data->{$b}->{key2} or         $data->{$b}->{key1} <=> $data->{$a}->{key1} or         $a cmp $b     } keys %{$data};  $key (@sorted){     print "$key\n"; } 

since <=> , cmp return 0 (false) equality, means can chain equality checks or or ||.

in example above $a , $b refer key of $data hashref @ particular iteration of sort. using these keys can access particular values of hash, e.g. $data->{$a}->{key2}. putting $a before $b cause sort in ascending order, , putting $b before $a cause sort in descending order.


Comments

Popular posts from this blog

c++ - llvm function pass ReplaceInstWithInst malloc -

Cross-Compiling Linux Kernel for Raspberry Pi - ${CCPREFIX}gcc -v does not work -

java.lang.NoClassDefFoundError When Creating New Android Project -