Here's an answer from Mastering Regular Expressions:
sub parse_csv {
my $text = shift; ## record containing comma-separated values
my @new = ();
push(@new, $+) while $text =~ m{
## the first part groups the phrase inside the quotes
"([^\"\\]*(?:\\.[^\"\\]*)*)",?
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($text, -1,1) eq ',';
return @new; ## list of values that were comma-spearated
}
## Use like this: @goodlist = parse_csv($csvlist);
Ugly, to be sure, but the complexity level really kicks up a notch when you
add the delimiters into the fields themselves. Also, the above snippet allows quotes inside
the fields, as long as they are backslashed.