расщепление строки в скобках в perl - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть эта строка, которую я хочу разделить в открывающих скобках.

SUBJ/TROPICAL DEPRESSION 26W (TWENTYSIX) WARNING NR 002/

В этом случае у меня будет две строки:

SUBJ/TROPICAL DEPRESSION 26W 

и

TWENTYSIX) WARNING NR 002/

Я пытался использовать функцию разделения для этого

$line=" SUBJ/TROPICAL DEPRESSION 26W (TWENTYSIX) WARNING NR 002/"
@namearr = split /\(/, ${line);

, но я получаю сообщение об ошибке.

(Might be a runaway multi-line "" string starting on line )

Как настроить кодвыше, чтобы я мог успешно разбить строку на основе скобок?

Ответы [ 2 ]

2 голосов
/ 12 ноября 2019

Код, который вы опубликовали, не приводит к ошибкам, которые вы утверждаете.

$ perl -e'
   $line=" SUBJ/TROPICAL DEPRESSION 26W (TWENTYSIX) WARNING NR 002/"
   @namearr = split /\(/, ${line);
' && echo ok
Array found where operator expected at -e line 3, near "@namearr"
        (Missing semicolon on previous line?)
syntax error at -e line 3, near "@namearr "
Missing right curly or square bracket at -e line 4, at end of line
Execution of -e aborted due to compilation errors.

В коде, который вы разместили, есть три ошибки.

  1. Отсутствует ; между утверждениями.
  2. ${line) - это опечатка для ${line}, которая должна быть $line. ${line} работает, но это недокументировано и необычно.
  3. Вы не ограничивали область действия своих переменных. Всегда используйте use strict; use warnings;!

$ perl -e'
   use strict;
   use warnings;
   my $line = " SUBJ/TROPICAL DEPRESSION 26W (TWENTYSIX) WARNING NR 002/";
   my @namearr = split /\(/, $line;
' && echo ok
ok

Ошибка, о которой вы спрашивали, обычно возникает, когда вы пропускаете закрывающий разделитель (кавычку) или, возможно, когда ваш литералимеет неэкранированный разделитель.

$ perl -e'
   my $s1 = "foo;
   my $s2 = "bar";
'
Bareword found where operator expected at -e line 3, near "my $s2 = "bar"
  (Might be a runaway multi-line "" string starting on line 2)
        (Do you need to predeclare my?)
String found where operator expected at -e line 3, at end of line
        (Missing semicolon on previous line?)
syntax error at -e line 3, near "my $s2 = "bar"
Can't find string terminator '"' anywhere before EOF at -e line 3.
0 голосов
/ 12 ноября 2019

Хм, почему бы не попробовать что-то подобное вместо split ?

use strict;
use warnings;

use Data::Dumper;

my $debug = 1;

my @parts;

while( <DATA> ) {
    chomp;
    @parts = /(.+)\((.*)\)(.*)/;
}

print Dumper(\@parts) if $debug;

__DATA__
SUBJ/TROPICAL DEPRESSION 26W (TWENTYSIX) WARNING NR 002/
...