Text::Balanced can handle all the nuances of quoted or delimited strings, including escapes. Plus it has built in diagnostics for unbalanced quotes, etc.
produces:use strict; use Text::Balanced qw(extract_quotelike); my $string = 'one two "three" four "five" six'; my ($q, $r, $p); my (@quoted, @unquoted); my ($quoted, $unquoted); $r = $string; while (($q, $r, $p) = extract_quotelike($r, '[^"]*')) { die "$@" if ($@ =~ /match/); $quoted .= " " if (defined($quoted)); $unquoted .= " " if (defined($unquoted)); if (!$q) { $unquoted .= $r; last; } $quoted .= $q; $unquoted .= $p; } @quoted = split(/\s+/, $quoted); @unquoted = split(/\s+/, $unquoted); print "quoted:\n ", join("\n ", @quoted), "\n"; print "unquoted:\n ", join("\n ", @unquoted), "\n";
quoted: "three" "five" unquoted: one two four six
I've used this package a bit. It's a little clumsy at times and may be overkill here but it may be useful if you need to handle more than the simple cases. If you're looking only for explict types of quotes one of its other methods may be more useful.
In reply to Re: separated quoted stings from unquoted strings
by steves
in thread separated quoted stings from unquoted strings
by Cody Pendant
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |