$hash{'Me'}->{"name"} = "Me"; $hash{'Me'}->{"number"} = "7.7"; $hash{'Chuck'}->{"name"} = "Chuck"; $hash{'Chuck'}->{"number"} = "7.7"; $hash{'Zed'}->{"name"} = "Zed"; $hash{'Zed'}->{"number"} = "7.7"; $hash{'Wife'}->{"name"} = "Wife"; $hash{'Wife'}->{"number"} = "7.6"; $hash{'Dad'}->{"name"} = "Dad"; $hash{'Dad'}->{"number"} = "53"; $hash{'Michael'}->{"name"} = "Michael"; $hash{'Michael'}->{"number"} = "24"; my @sortedKeys = SortHashByMultipleColumns(\%hash,["number:asc","name:asc"]); foreach my $sortedKey(@sortedKeys){ print $hash{$sortedKey}->{'number'} . " " . $hash{$sortedKey}->{'name'} . "\n"; } sub SortHashByMultipleColumns{ my($hashRef,$sortInfoAR) = @_; my $sortCriteria; foreach my $sortInfo(@$sortInfoAR){ my($sortColumn,$sortDirection) = split(/\:/,$sortInfo); my $sortType; # VERIFY THAT THIS IS A VALID COLUMN if(! defined $hashRef->{((keys %$hashRef))[0]}->{$sortColumn}){ print "SortHashByMultipleColumns Error: $sortColumn is not a column in this hash.\n"; exit(0); # VALID COLUMN, FIGURE OUT IF IT IS A NUMERIC COLUMN OR ALPHA } else { if($hashRef->{((keys %$hashRef))[0]}->{$sortColumn} =~ /^\d+/){ $sortType = "numeric"; } else { $sortType = "alpha"; } } # want to sort a number if($sortType eq "numeric"){ # sort it asc if($sortDirection =~ /asc/i){ # add an or if we already have something in the sort criteria if($sortCriteria){ $sortCriteria .= qq| or |; } $sortCriteria .= '$hashRef->{$a}->{\'' . $sortColumn . '\'} <=> $hashRef->{$b}->{\'' . $sortColumn . '\'}'; # sort it desc } else { # add an or if we already have something in the sort criteria if($sortCriteria){ $sortCriteria .= qq| or |; } $sortCriteria .= '$hashRef->{$b}->{\'' . $sortColumn . '\'} <=> $hashRef->{$a}->{\'' . $sortColumn . '\'}'; } # want to sort it by alpha } else { # sort it asc if($sortDirection =~ /asc/i){ # add an or if we already have something in the sort criteria if($sortCriteria){ $sortCriteria .= qq| or |; } $sortCriteria .= '$hashRef->{$a}->{\'' . $sortColumn . '\'} cmp $hashRef->{$b}->{\'' . $sortColumn . '\'}'; # sort it desc } else { # add an or if we already have something in the sort criteria if($sortCriteria){ $sortCriteria .= qq| or |; } $sortCriteria .= '$hashRef->{$b}->{\'' . $sortColumn . '\'} cmp $hashRef->{$a}->{\'' . $sortColumn . '\'}'; } } } my $sortfunc = eval "sub { $sortCriteria }"; my @sortedKeys = sort $sortfunc keys %$hashRef; return @sortedKeys; }