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

ノート:

  • ハッシュ参照の配列は、リストの順序を保持するために使用されます。
  • utf8プラグマにより、構成が[:alpha:]utf8対応になります。
  • Perl> = v5.10の場合、utf8::allプラグマは出力前にutf8呼び出す必要性を置き換え、削除することもでき&binmodeます。
  • 見回し(、、(?=)など(?<=))は注意が必要です。それらの良い情報については、 perlreこのガイドを参照してください。
于 2011-10-03T12:35:29.533 に答える
-1

正規表現を設定してみるとよいと思います。',' を ',\n' に置き換えるのと同じ方法で、任意の 'word:' を '\nword:' に置き換えることができます。

正規表現を確認するには、このページを確認してください: 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 に答える