use strict; use Text::CSV; use Data::Dumper; my @lines=; my $csv = Text::CSV->new ({sep_char => ',' , quote_char => "'", allow_whitespace => 1}); my @AoA; for (@lines) { if (/^\((.+?)\).?/){my $con=$1; if ($csv->parse($con)) { my @fields = $csv->fields(); push @AoA,[@fields]; } else { warn "Line could not be parsed: $_\n"; } } } print Dumper \@AoA; __DATA__ (101, '1997-02-25', 'S1', 31.00, NULL, 0.00, 'this becomes two fields, so no go', 5.11), (102, '1998-03-26', 'S1', 31.00, NULL, 0.00, 'this will remain one field', 6.11), #### $VAR1 = [ [ '101', '1997-02-25', 'S1', '31.00', 'NULL', '0.00', 'this becomes two fields, so no go', '5.11' ], [ '102', '1998-03-26', 'S1', '31.00', 'NULL', '0.00', 'this will remain one field', '6.11' ] ];