in reply to double sort HoH by value/key

You are very close. Change the first term of the sort to

$HoH{$b}->{"value2"} <=> $HoH{$a}->{"value2"}

I would do without the complication of printf as you are not doing any fancy formatting.

use strict; use warnings; my %HoH = ( "a" => { "value1" => "foo", "value2" => "1"}, "e" => { "value1" => "bar", "value2" => "2"}, "b" => { "value1" => "foo", "value2" => "2"}, "f" => { "value1" => "bar", "value2" => "2"}, "d" => { "value1" => "foo", "value2" => "3"}, "c" => { "value1" => "bar", "value2" => "5"}, "h" => { "value1" => "foo", "value2" => "4"}, "g" => { "value1" => "foo", "value2" => "4"} ); print map {qq{$_ has v1=$HoH{$_}->{value1} and v2=$HoH{$_}->{value2}\n}} sort { $HoH{$b}->{value2} <=> $HoH{$a}->{value2} || $a cmp $b } keys %HoH;

I hope this is of use.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: double sort HoH by value/key
by rb1980 (Initiate) on Nov 21, 2007 at 22:13 UTC
    Thanks, that was it. I guess I still don't understand why, but at least I have a working example to go off of. The hash of hashes concept is a little mind boggling at first. (the only reason I was using the printf was because abstracted out this example from some other code I was working on). Much appreciated.
      I guess I still don't understand why ...

      Perhaps this explanation will help. You passed each key of %HoH into your sort routine (where they are accessed as $a and $b) in order to get those keys back out in a particular order. Your second term, the keys ascending alphabetically caused you no problem. The first term, the value keyed by 'value2' in the sub-hash numerically descending, required a little more work. You needed to bear in mind that since the keys of %HoH were passed into to sort, when accessing %HoH inside the routine, you needed to use $a and $b in exactly the same place you would normally use a key into %HoH.

      If you find that your mind has become somewhat boggled by data structures, especially ones that you have built programmatically, I recommend that you use Data::Dumper to examine them. It gives a nice human-readable representation of the structure which is, usefully, valid Perl code.

      I hope this helps your understanding but if you still have questions please ask further.

      Cheers,

      JohnGG