use strict; use Data::Dumper; my @in = ( [qw(M N)], [qw(M N P O)], [qw(C B A)], [qw(U S)], [qw(V T)], [qw(C G F E D)], [qw(C G F H)], [qw(C G F H I)], [qw(C G F H J)], [qw(M K)] ); sub arrayCompare { my @a = @$a; my @b = @$b; while ( 1 ) { return 0 if @a ==0 && @b == 0; return -1 if @a == 0; return 1 if @b == 0; my $cmp = $a[0] cmp $b[0]; return $cmp if $cmp != 0; shift @a; shift @b; } } my @out = sort arrayCompare @in; print Dumper @out;