http://www.perlmonks.org?node_id=1013657

krishnashah has asked for the wisdom of the Perl Monks concerning the following question:

Hash looks like this:
$VAR1 = { Key1:Key1_si => { 'KeyA' => { Keya => 'abcd, defg', keyb => '1000', keyc => '80%', keyd => '2011.10.09', keye => '1234-UR-DDDD', keyf => 'rwh', keyg => '600', keyh => 'red', keyi => '900', keyj => '', keyk =>'int4678_tt', }, 'KeyB' => { Keya => 'abcd, defg', keyb => '2000', keyc => '100%', keyd => '2011.11.09', keye => '1234-UR-DDDD', keyf => 'rwh', keyg => '500', keyh => 'red', keyi => '400', keyj => '', keyk =>'int4678_tt', }, }, };
Question: I want to sort this hash on the basis of 'keyc' whose value is varied. So, I want to sort on the basis like below: Key1:Key1_si->KeyB->Keyc Key1:Key1_si->KeyA->keyc Also, I want to have the output with the sorted values along with the rest of attributes like : Print: Key1:Key1_si KeyB Keya keyd Keyc keyf Key1:Key1_si KeyA keya keyd Keyc keyf Can somebody please help me with the code in perl to perform sort as mentioned above. I will really appreciate your time and efforts.

Thanks, Krishna

Replies are listed 'Best First'.
Re: Perl - Sort a multi dimensional hash
by choroba (Cardinal) on Jan 17, 2013 at 02:30 UTC
    You cannot sort a hash. You can sort the keys, though:
    my %subhash = %{ $hash->{'Key1:Key1_si'} }; my @sorted_keys = sort { $subhash{$a}{keyc} <=> $subhash{$b}{keyc} } keys %subhash; for my $key (@sorted_keys) { print "Key1:Key1_si $key"; print ' ', $subhash{$key}{$_} for sort keys %{ $subhash{$key} }; print "\n"; }
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: Perl - Sort a multi dimensional hash
by LanX (Saint) on Jan 16, 2013 at 23:35 UTC
    Unreadable! Please edit your post and insert code and paragraph tags:

    paragraph <p> ... paragraph <p> ... <c> your($code); </c> paragraph <p> ...

    Cheers Rolf

Re: Perl - Sort a multi dimensional hash
by AnomalousMonk (Archbishop) on Jan 16, 2013 at 23:41 UTC
Re: Perl - Sort a multi dimensional hash
by krishnashah (Initiate) on Jan 17, 2013 at 00:41 UTC

    I hope you can see now. Please help me with the problem.