my @hashes = ( {name=>'a', flag=>1}, {name=>'a', flag=>0}, {name=>'b', flag=>1}, {name=>'c', flag=>0}, {name=>'b', flag=>0} ); @hashes = sort { $a->{name} cmp $b->{name} or $a->{flag} cmp $b->{flag} } @hashes; The order that this gives me is: name: a flag: 0 name: b flag: 0 name: c flag: 0 name: a flag: 1 name: b flag: 1 But what I want is: name: a flag: 1 name: b flag: 1 name: a flag: 0 name: b flag: 0 name: c flag: 0