use strict; use warnings; use Data::Dumper; my $str = 'one "two three" four five "six seven eight" nine'; my @words = map { $_ || () } split /"(\\"|.*?)"|\s+/, $str; print Dumper(\@words);