my @matrix = ( [ qw( 1 2 4 4 ) ], [ qw( 5 2 0 8 ) ], [ qw( 9 10 11 12 ) ], ); my @t; foreach my $column_num ( 0 .. $#{ $matrix[0] } ) { my @slice = map { $_->[$column_num] } @matrix; my @r; foreach my $n ( @slice ) { last if $n == 0; push @r, $n; } push @t, [@r]; }