my @cols; for my $row (@array) { my @f = split /,/, $row; $f[2] = $b[$f[2]]; push @{$cols[$_]}, $f[$_] for 0 .. $#f; } #### my %col_for = ( foo => 2, bar => 4, baz => 5, ); my @cols; for my $row (@array) { my @f = split /,/, $row; splice @f, $col_for{$f[1]} || 6, 0, shift @b; push @{$cols[$_]}, $f[$_] for 0 .. $#f; }