use Data::Dump 'pp'; # only used for output my @data = map { [ map { int rand(3) } 1 .. 5 ] } 1 .. 10; my @sorted = sort { $a->[1] <=> $b->[1] # sort by column 1 ascending || $a->[0] <=> $b->[0] # then column 0 || $b->[3] <=> $a->[3] # then column 3 descending } @data; pp @sorted; #### ( [0, 0, 2, 2, 2], [0, 0, 0, 0, 1], [0, 0, 2, 0, 1], [1, 0, 2, 2, 0], [2, 0, 0, 2, 2], [0, 1, 0, 1, 2], [1, 1, 0, 2, 2], [1, 1, 1, 1, 2], [0, 2, 2, 0, 0], [2, 2, 2, 0, 0], )