Таким образом, вы можете разделить запятую в большинстве случаев, но в противном случае пробелом, которому предшествует правая скобка.Это было бы:
/, |(?<=\)) /
Или, может быть (?) Более четко:
/,[[:space:]]|(?<=\))[[:space:]]/
Символ трубы будет иметь дизъюнктивное соответствие между тем, что находится по обе стороны от него.Но есть также разбор ролей, и вся строка полна не-ascii символов.
Сценарий:
use strict;
use warnings;
use utf8;
use Data::Dump 'dump';
my $big_string = q/rendező: ... hangja)/;
my @credits = map {
my ($title, $names) = /([[:alpha:]()]+): (.+)/;
my @names = split /,[[:space:]]|(?<=\))[[:space:]]/, $names;
my $credit = { $title => \@names };
} split / (?=[[:alpha:]()]+:)/, $big_string;
binmode STDOUT, ':utf8';
print dump \@credits;
Вывод:
[
{ rendező => ["Joe Carnahan"] },
{
forgatókönyvíró => ["Brian Bloom", "Michael Brandt", "Skip Woods"],
},
{ zeneszerző => ["Alan Silvestri"] },
{ operatőr => ["Mauro Fiore"] },
{
producer => ["Stephen J. Cannell", "Jules Daly", "Ridley Scott"],
},
{
"szerepl\x{151}(k)" => [
"Liam Neeson (John 'Hannibal' Smith ezredes)",
"Bradley Cooper (Templeton 'Sz\xE9pfi\xFA' Peck hadnagy)",
],
},
{
szinkronhang => [
"G\xE1ti Oszk\xE1r (John 'Hannibal' (Smith magyar hangja))",
"Rajkai Zolt\xE1n (Templeton 'Faceman' Peck magyar hangja)",
],
},
]
Примечания:
- Массив hashrefs используется для сохранения порядка списка.
- Прагма
utf8
сделает конструкцию [:alpha:]
utf8-осведомленной. - Учитывая Perl> = v5.10, прагма
utf8::all
может заменить utf8
, а также убрать необходимость вызова &binmode
перед выводом. - Lookarounds (
(?=)
, (?<=)
и т. Д.).) может быть хитрым;см. perlre и в этом руководстве для получения подробной информации о них.