Сплит линия с Perl - PullRequest
       30

Сплит линия с Perl

0 голосов
/ 03 октября 2011

У меня есть многострочные кредиты с пропуском нескольких запятых:

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)

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Таким образом, вы можете разделить запятую в большинстве случаев, но в противном случае пробелом, которому предшествует правая скобка.Это было бы:

/, |(?<=\)) /

Или, может быть (?) Более четко:

/,[[: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 и в этом руководстве для получения подробной информации о них.
0 голосов
/ 03 октября 2011

Я думаю, вы можете попытаться настроить регулярное выражение. Вы можете заменить любое слово: на \ nword: таким же образом вы можете подставить ',' с помощью ', \ n'

чтобы посмотреть регулярное выражение, проверьте эту страницу: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

2 руля должны быть похожи на:

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

это всего лишь предположение ... не совсем известно о синтаксисе Perl

...