-1

我有一个缺少几个逗号的多行学分:

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)

谢谢

4

2 回答 2

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)",
    ],
  },
]

笔记:

  • hashrefs 数组用于保存列表的顺序。
  • utf8编译指示将使构造[:alpha:]utf8 感知。
  • 给定 Perl >= v5.10,utf8::allpragma 可以替换utf8并消除在&binmode输出之前调用的需要。
  • 环顾四周((?=),(?<=)等)可能很棘手;有关它们的详细信息,请参阅perlre本指南
于 2011-10-03T12:35:29.533 回答
-1

我认为您可以尝试设置正则表达式。您可以用 '\nword:' 替换任何 'word:',就像用 ',\n' 替换 ','

看看正则表达式检查这个页面: http ://www.troubleshooters.com/codecorn/littperl/perlreg.htm

2个规则应该类似于:

$newstr ~= ($str =~ tr/[a-zA-Z]+:/(\n)[a-Z]+:/);

这只是一个猜测......不太了解 Perl 语法

于 2011-10-03T11:53:17.203 回答