#!/usr/bin/env perl use strict; use warnings; use Scalar::Util qw{looks_like_number}; my @master_alpha_list = ( ['blah', 'asdf', 'foo', 'bar'], ['two'], ['zzz', 'def', 'ghi'], ['one'], ['mmm', 'def', 'ghi'], ['qqq', 'xyz', 'aaa'] ); my @master_num_list = ( [ 0, 1, 2, 3 ], [ 2 ], [ 9, 3, 6 ], [ 1 ], [ 5, 3, 6 ], [ 7, 8, 1 ], ); my @alpha_asc = sort { @$a <=> @$b || gen_sort() } @master_alpha_list; my @alpha_dsc = sort { @$a <=> @$b || gen_sort(1) } @master_alpha_list; my @num_asc = sort { @$a <=> @$b || gen_sort() } @master_num_list; my @num_dsc = sort { @$a <=> @$b || gen_sort(1) } @master_num_list; use Data::Dump; dd $_ for (\@alpha_asc, \@alpha_dsc, \@num_asc, \@num_dsc); sub gen_sort { my ($desc) = @_; my $compare = looks_like_number($a->[0]) ? \&cmp_num : \&cmp_alpha; my ($x, $y) = $desc ? ($b, $a) : ($a, $b); my $cmp; ($cmp = $compare->($x->[-$_], $y->[-$_])) ? last : next for 1 .. @$a; return $cmp; } sub cmp_alpha { $_[0] cmp $_[1] } sub cmp_num { $_[0] <=> $_[1] }