Following your approach, I came with the following code that creates one array with all the strings that result from the concatenation of all the columns. Note that I'm not taking into account eventual memory problems that may arise from the amount of columns/lines your csv may have.
use strict;
use warnings;
use Data::Dumper;
my @parsed = ();
while (<DATA>) {
my $in = $_;
chomp($in);
my @line = split(/,/, $in);
for my $i(0..$#line) {
$parsed[$i] .= $line[$i].'|';
}
}
map {chop} @parsed;
print Dumper(\@parsed);
__DATA__
123,"text",66,"more text"
124,"text1",67,"more text1"
125,"text2",68,"more text2"
outputs
$VAR1 = [
'123|124|125',
'"text"|"text1"|"text2"',
'66|67|68',
'"more text"|"more text1"|"more text2"'
];