use strict; use warnings; use Data::Dump; my %apples = ( one => { weight => 10, golden=> 0}, two => { weight => 20, golden=> 0}, three => { weight => 5 , golden=> 1}, ); my @sorted = sort{ ( $apples{$b}->{golden} ? $apples{$b}->{weight} * 10 : $apples{$b}->{weight} ) <=> ( $apples{$a}->{golden} ? $apples{$a}->{weight} * 10 : $apples{$a}->{weight} ) }keys %apples; dd @sorted; __END__ ("three", "two", "one")