use strict; use warnings; use Data::Dumper; my @AoA = ( ['blah', 'asdf', 'foo', 'bar'], ['two'], ['zzz', 'def', 'ghi'], ['one'], ['mmm', 'def', 'ghi'], ['qqq', 'xyz', 'aaa'], ); my @sortedAoA = do { my $recSort; $recSort = sub { my @arrA = @{ $_[ 0 ] }; my @arrB = @{ $_[ 1 ] }; return 0 unless @arrA; return ( pop( @arrA ) cmp pop( @arrB ) ) || $recSort->( \ @arrA, \ @arrB ); }; sort { @$a <=> @$b || $recSort->( $a, $b ) } @AoA; }; print Data::Dumper->Dumpxs( [ \ @sortedAoA ], [ qw{ *sortedAoA } ] );