use Data::Dumper; my @matrix = ( [ qw(ab cd ef gh)], [ qw(ij kl mn op)], [ qw(qr st uv wx)] ); my @transposed = map { my $i = $_; [ map $matrix[$_]->[$i], 0 .. $#matrix ] } 0 .. $#{$matrix[0]}; print Dumper(\@transposed); __output__ $VAR1 = [ [ 'ab', 'ij', 'qr' ], [ 'cd', 'kl', 'st' ], [ 'ef', 'mn', 'uv' ], [ 'gh', 'op', 'wx' ] ];