abc "a\"bc$xyz$abc$x$y" $bla'h, $blah
hello k\$nob
this is "\"'abc$xy$z\"" test "$"
a$$bc "$$abc$xyz$abc$" blah, $$, blah
####
abc "a\"bc\$xyz\$abc\$x\$y" $bla'h, $blah
hello k\$nob
this is "\"'abc\$xy\$z\"" test "\$"
a$$bc "\$\$abc\$xyz\$abc\$" blah, $$, blah
####
my $str = <<'EOS';
abc "a\"bc$xyz$abc$x$y" $bla'h, $blah
hello k\$nob
this is "\"'abc$xy$z\"" test "$"
a$$bc "$$abc$xyz$abc$" blah, $$, blah
EOS
print "$str\n\n";
# $qq matches a double quoted string.
my $qq = qr/"[^"\\]*(?:\\.[^"\\]*)*"/;
# Break $str into fields (quoted or unquoted).
my @fields = $str =~ /$qq|[^"]+/g;
# Escape $ in quoted fields only.
/^"/ && s/\$/\\\$/g for @fields;
print @fields;