sub do_msalist { my (%country, %state, %msaname, @msakeys); sub by_americentric { $country{$b} cmp $country{$a} or $state{$a} cmp $state{$b} or $msaname{$a} cmp $msaname{$b} or $a <=> $b } foreach (sort by_americentric @msakeys) { ... } }