我有一个多行学分,缺少一些逗号:
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ő(k): Liam Neeson (John 'Hannibal' Smith ezredes) Bradley Cooper (Templeton 'Szépfiú' Peck hadnagy) szinkronhang: Gáti Oszkár (John 'Hannibal' (Smith magyar hangja)) Rajkai Zoltán (Templeton 'Faceman' Peck magyar hangja)
这导致无法用逗号分割:
$credits (split /, */, $line):
我想在逗号之后拆分,如果积分之间不存在逗号,则在第一次积分后分开(例如):
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ő(k): Liam Neeson (John 'Hannibal' Smith ezredes)
Bradley Cooper (Templeton 'Szépfiú' Peck hadnagy)
szinkronhang: Gáti Oszkár (John 'Hannibal' (Smith magyar hangja))
Rajkai Zoltán (Templeton 'Faceman' Peck magyar hangja)
由于
答案 0 :(得分:2)
因此,在大多数情况下,您可以使用逗号空格进行拆分,但除非是以右括号开头的空格字符。这将是:
/, |(?<=\)) /
或者,或许(?)更清楚:
/,[[: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)",
],
},
]
注意:
utf8
pragma会使[:alpha:]
构造知道utf8。utf8::all
pragma可以替换utf8
,并且无需在输出之前调用&binmode
。(?=)
,(?<=)
等)可能很棘手;有关这些内容的详细信息,请参阅perlre和this guide。答案 1 :(得分:-1)
我认为您可以尝试设置正则表达式。 你可以用'\ nword:'替换任何'word:' 以同样的方式,您可以使用',\ n'
替换','查看正则表达式检查此页面: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm
2轮次应该类似于:
$newstr ~= ($str =~ tr/[a-zA-Z]+:/(\n)[a-Z]+:/);
这只是一个猜测......并不真正了解Perl语法