#!/usr/bin/perl use strict; use warnings; use Tie::Hash::Sorted; my %hash = ( 'william A nye' => '39||Somehere in Cali||Cali||12345', 'homer simpson' => '36||Springfield||unknown||23456', 'barney rubble' => '31||Bedrock||cartoon location||3456', ); my %sort_by = ( val1 => sub { my $hash = shift; return [ map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [$_ , split /\|\|/ , $hash->{$_} ] } keys %$hash ]; }, val2 => sub { my $hash = shift; return [ map { $_->[0] } sort { $a->[2] cmp $b->[2] } map { [$_ , split /\|\|/ , $hash->{$_} ] } keys %$hash ]; }, ); tie my %sorted_hash, 'Tie::Hash::Sorted', 'Hash' => \%hash, 'Sort_Routine' => $sort_by{val1}; print "Sorting on the first sub value\n"; print "$_ : $sorted_hash{$_}\n" for keys %sorted_hash; # Later on you want to sort by the second field tied( %sorted_hash )->Sort_Routine( $sort_by{val2} ); print "\nSorting on the second sub value\n"; print "$_ : $sorted_hash{$_}\n" for keys %sorted_hash;