use strict;
my $line = join ",",
(
'"completely quoted"',
'not quoted',
'partially "quoted"',
'"completely quoted with embedded, comma"',
'partially "quoted with embedded, comma"',
'quote \'and comma, inside " single\' quote',
'single quote "and comma, inside of \' double" quote',
'last'
);
my $re = qr/((?:[^"',]|"[^"]*"|'[^']*')+)/;
print(">$_<\n") for $line =~ /$re/g;
####
>"completely quoted"<
>not quoted<
>partially "quoted"<
>"completely quoted with embedded, comma"<
>partially "quoted with embedded, comma"<
>quote 'and comma, inside " single' quote<
>single quote "and comma, inside of ' double" quote<
>last<
####
one,,three