use warnings; use strict; my @matrix = ( ["A12a1", "img5", "x456", "y456"], ["A1a2", "img2", "x123", "y456"], ["A1a1", "img1", "x123", "y123"], ["A10a1", "img4", "x456", "y123"], ["A1a12", "img3", "x456", "y789"], ); my @sorted = sort natsort @matrix; use Data::Dump 'pp'; print pp \@sorted; sub natsort { # sort by first column (note the dereferencing) my @a = split /(\d+)/, $a->[0]; my @b = split /(\d+)/, $b->[0]; my ($A,$B); while (defined($A = shift @a) and defined($B = shift @b)) { my $res = ($A =~ /\d/) ? $A <=> $B : $A cmp $B; return $res if $res; } return defined $A ? -1 : 1; } __END__ [ ["A1a1", "img1", "x123", "y123"], ["A1a2", "img2", "x123", "y456"], ["A1a12", "img3", "x456", "y789"], ["A10a1", "img4", "x456", "y123"], ["A12a1", "img5", "x456", "y456"], ]