Удаление строк с неанглийскими символами с помощью Perl

Учитывая эти данные

TRMMJJH12903CF8B69<SEP>SOKSZAQ12AC9070DC0<SEP>Alexandre Da Costa<SEP>Violin Concerto No.1 in G minor_ Op.26 - III. Allegro energico

TRMMOWW128F1465642<SEP>SOGELZG12A6D4F865F<SEP>Yann Tiersen<SEP>La Valse D'Amélie (Version Orchestre)

Я должен отсеять все до названия песни, что я и сделал успешно.

Затем я должен удалить все после +, (, {, [ и т. д., что я успешно сделал.

Часть, на которой я застрял, заключается в том, что если в строке есть неанглийский символ, как в песне Янна Тирсена, то я должен полностью удалить его.

Я попытался посмотреть в документации, чтобы понять, как использовать \w и \s, но я не могу понять, как поместить это в код и использовать его.

Вот мой код:

@songs = map { chomp; (split /<SEP>/)[3] } @data;
for (my $i = 0 ; $i < @songs . length ; $i++) {

  $title = @songs[$i];
  $title =~ s/feat..*//s;
  $title =~ s/\(.*//s;
  $title =~ s/\[.*//s;
  $title =~ s/\{.*//s;
  $title =~ s/\/.*//s;
  $title =~ s/\\.*//s;
  $title =~ s/\+.*//s;
  $title =~ s/\=.*//s;
  $title =~ s/\*.*//s;
  $title =~ s/\".*//s;
  $title =~ s/\:.*//s;
  $title =~ s/\-.*//s;
  $title =~ s/\'.*//s;
  $title =~ s/\_.*//s;
  $title =~ s/\?.*//s;
  $title =~ s/\..*//s;
  $title =~ s/\!.*//s;
  $title =~ s/\;.*//s;
  $title =~ s/\&.*//s;
  $title =~ s/\$.*//s;
  $title =~ s/\%.*//s;
  $title =~ s/\#.*//s;
  $title =~ s/\|.*//s;
  $title =~ s/\@.*//s;
  $title =~ s/\.*//s;
  $title =~ s/\!.*//s;
  $title =~ s/\¿.*//s;
  $title =~ s/\¡.*//s;
  $title !~ s/[^[:ascii:]]//g;
  $title = lc($title);

  print $title, $i, "\n";

}

Вывод выглядит следующим образом:

violin concerto no
la valse d

Второй строки быть не должно.


person Kooky_Lukey    schedule 09.02.2014    source источник
comment
Это удивительно неэффективный подход к делу! Вы просто пытаетесь выделить название песни из приведенного выше примера?   -  person fugu    schedule 10.02.2014
comment
В частности, чего вы пытаетесь достичь?   -  person stevemarvell    schedule 10.02.2014
comment
Какая вторая строчка?   -  person Kenosis    schedule 10.02.2014
comment
я пытаюсь полностью удалить строку, если она имеет не английский символ. Я знаю, что это неэффективно, это было только первое, что я попробовал, и я просто продолжал добавлять. Вторая строка - это вальс d. Эта линия должна полностью исчезнуть   -  person Kooky_Lukey    schedule 10.02.2014
comment
Код Perl, который вы показываете, удаляет много знаков препинания. Это правильно? Вы говорите, что хотите полностью удалить строку, если она содержит неанглийский символ. Это означает, что из данных вашего примера ничего не выживет, потому что первая строка содержит точку, а вторая — апостроф. Кроме того, есть ли действительно пустая строка между текстовыми записями? Вы должны показать точно, с чем имеете дело.   -  person Borodin    schedule 10.02.2014


Ответы (1)


use strict;
use warnings;   

my @data = ('TRMMJJH12903CF8B69<SEP>SOKSZAQ12AC9070DC0<SEP>Alexandre Da Costa<SEP>Violin Concerto No.1 in G minor_ Op.26 - III. Allegro energico', 'TRMMOWW128F1465642<SEP>SOGELZG12A6D4F865F<SEP>Yann Tiersen<SEP>La Valse D\'Amélie');

foreach (@data){
    my @split = split(/<SEP>/);
    print "$split[3]\n" unless /[^[:ascii:]]/;
}

Отпечатки:

Violin Concerto No.1 in G minor_ Op.26 - III. Allegro energico
person fugu    schedule 09.02.2014