use strict; use warnings; my $regex = qr/(' ([^']*) ' | " ([^"]*) " | (.*))/x; do_test (qq~No quote~); do_test (qq~'Single quote'~); do_test (qq~"Double quote"~); sub do_test { my ($line) = @_; print "\n"; if ($line =~ $regex) { print "\$1 is $1.\n" if defined $1; print "\$2 is $2.\n" if defined $2; print "\$3 is $3.\n" if defined $3; print "\$4 is $4.\n" if defined $4; } else { print "No match.\n"; } }