Вы можете использовать простое чередование в своем регулярном выражении для разделения:
my @parts = split(/\s*,\s*|\s+and\s+/, $string1);
Например:
$ perl -we 'my $string1 = "Joe Smith, Jason Jones, Jane Doe and Jack Jones";print join("\n",split(/\s*,\s*|\s+and\s+/, $string1)),"\n"'
Joe Smith
Jason Jones
Jane Doe
Jack Jones
$ perl -we 'my $string2 = "Jane Doe and Joe Smith";print join("\n",split(/\s*,\s*|\s+and\s+/, $string2)),"\n"'
Jane Doe
Joe Smith
Если вам также приходится иметь дело с оксфордской запятой (то есть "то, то и другое "), тогда вы могли бы использовать
my @parts = split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $string1);
Например:
$ perl -we 'my $s = "Joe Smith, Jason Jones, Jane Doe, and Jack Jones";print join("\n",split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $s)),"\n"'
Joe Smith
Jason Jones
Jane Doe
Jack Jones
$ perl -we 'my $s = "Joe Smith, Jason Jones, Jane Doe and Jack Jones";print join("\n",split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $s)),"\n"'
Joe Smith
Jason Jones
Jane Doe
Jack Jones
$ perl -we 'my $s = "Joe Smith and Jack Jones";print join("\n",split(/\s*,\s*and\s+|\s*,\s*|\s+and\s+/, $s)),"\n"'
Joe Smith
Jack Jones
Благодаря stackoverflowuser2010 за то, что отметили этот случай.
Вы захотите, чтобы \s*,\s*and\s+
в начале не давало другим ветвям чередования расщепляться на запятую или "и" сначала, этот порядок также гарантированно :
Альтернативы пробуются слева направо, поэтому первой найденной альтернативой, для которой соответствует все выражение, является выбранная.