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