my $sort = 'hours'; # really comes from a switch my %map = ( # sorting map hours => [0, \sub {<=>}], code => [1, \sub {cmp}], name => [2, \sub {cmp}], ); # example data my @records = ( [10, 'xyz232', 'secret project'], [ 5, 'foo123', 'world domination'], [ 7, 'bar666', 'have a beer'], ); for ( sort {$a->[$map{$sort}->[0]] $map{$sort}->[1] $b->[$map{$sort}->[0]]} @records ) { print join ", ", @$_; } #### my %map = ( hours => sub {sort { $_[0] <=> $_[0] } };, number => sub {sort { $_[0] <=> $_[0] } };, name => sub {sort { $_[0] <=> $_[0] } };, task => sub {sort { $_[0] <=> $_[0] } };, );