【问题标题】:spliting a line at a parentheses in perl在perl的括号中分割一行
【发布时间】:2020-03-07 15:46:50
【问题描述】:

我想在左括号处拆分这个字符串。

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 )

如何调整上面的代码,以便可以根据括号成功拆分行?

【问题讨论】:

  • 在分配后遗漏了;$line="..." 应改为$line="...";)...
  • ${line) 应该是${line} 或者只是$line...
  • 只需修正@stickybit 识别的拼写错误,您的代码应该会产生预期的结果。
  • 您发布的代码不会导致您声称的错误。请提供minimal reproducible example
  • 这里的正则表达式匹配或替换可能比split 更合适。

标签: string perl split


【解决方案1】:

您发布的代码不会导致您声称的错误。

$ 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.

【讨论】:

    【解决方案2】:

    嗯,为什么不尝试这样的方法而不是 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/
    

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多