while (1) { if ( $v =~m{\G(.*?)([\\",])}gc ) { if ( $2 eq "\\" ) { $v[-1].=$1.$2.substr( $v,pos($v),1 ); pos($v)++; } elsif ( $2 eq '"' ) { $v[-1].=$1.$2; $quoted = !$quoted; } elsif ( $2 eq ',' ) { # next item if not quoted ( $v[-1].=$1 ) =~s{\s+$}{}; # strip trailing space push @v,'' if !$quoted; $v =~m{\G\s+}gc; # skip space after ',' } } else { # add rest to last from @v $v[-1].= substr($v,pos($v)||0 ); last; }