将Perl文件拆分为空格时出现读取问题

我正在从输入文件中读取数据,如果该行中包含Date,则需要取出整行并进行处理。在我的示例中,Mem-Id是唯一值,我想创建一个以Mem-Id为键的哈希。根据数据,这里是每个字段的等效值

Id -> 1
Mem-Id -> 1
Date & Time (+00:00) -> 2018-07-30T07:40:23
Priority -> LOW
Main Affected objects -> val/s1 val/s0;
Text -> Temperature exceded the limit

这是我的代码:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @data = <DATA> ;

foreach my $data_line ( @data ){
    chomp $data_line;
    if( $data_line =~ m/[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/){
        my ($id,$mem_id,$date_time,$priority,$affected_obj,$text) = split(/\s+/,$data_line);
        print "$id,$text\n";
    }
}

__DATA__
.............
.............
.............
========================================================
Id Mem-Id Date & Time (+00:00) Priority Main Affected objects Text
========================================================
1 1 2018-07-30T07:40:23 LOW val/s1 val/s0; Temperature exceded the limit
======================================================== 
............
............

执行上述脚本时,我得到以下输出错误:

1,1,2018-07-30T07:40:23,LOW,val/s1,val/s0;

由于Main Affected objects的值中有空格,因此将其作为单独的值并分配给$affected_obj$text变量。

在用空格分割数据行时,如何为$affected_obj$text分配值。

Main Affected objects = val/s1 val/s0;
Text = Temperature exceded the limit
zqf1235678910 回答:将Perl文件拆分为空格时出现读取问题

我非常乐意将事情保持尽可能简单。我认为您可以通过两次致电split()来做到这一点。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

while (<DATA>) {
  # Split 1: split the text column off by looking for the semi-colon
  my ($rest,$text) = split /;\s*/;
  # Split 2: split the rest of the data on whitespace. But use a split 
  # limit (5) to stop the affected objects from being split apart.
  my ($id,$mem_id,$datetime,$priority,$affected) = split /\s+/,$rest,5;

  say join ' | ',$id,$affected,$text;
}

__DATA__
1 1 2018-07-30T07:40:23 LOW val/s1 val/s0; Temperature exceded the limit

输出:

1 | 1 | 2018-07-30T07:40:23 | LOW | val/s1 val/s0 | Temperature exceded the limit
,
  

如有疑问,请使用正则表达式。
   -本尼迪克特九世

my @data = <DATA> ;

my $matcher = qr/
    ^ (?<id>(?&token_id))            (?&splitter) 
      (?<mem_id>(?&token_id))        (?&splitter)
      (?<date>(?&token_date))        (?&splitter)     
      (?<priority>(?&token_prio))    (?&splitter)     
      (?<affected>(?&token_objects)) (?&splitter)     
      (?<text>(?&token_rest_of_line))

    (?(DEFINE)
        (?<splitter>   \x20        )   # blank
        (?<token_id>   \d++        )         
        (?<token_date> [0-9]{4} - [0-9]{2} - [0-9]{2} T [0-9]{2} : [0-9]{2} : [0-9]{2} )
        (?<token_prio> HI|LOW )
        (?<token_objects> [^;]++ ; ) # you can get more complex here if needed
        (?<token_rest_of_line> .+ $ )
    )
/x;

foreach my $data_line ( @data ){
    chomp $data_line;
    if( $data_line =~ $matcher ) {
        print Dumper( \%+ );
        # $VAR1 = {
        #   'affected' => 'val/s1 val/s0;',#   'priority' => 'LOW',#   'mem_id' => '1',#   'id' => '1',#   'date' => '2018-07-30T07:40:23',#   'text' => 'Temperature exceded the limit'
        # };
    }
}

__DATA__
.............
.............
.............
========================================================
Id Mem-Id Date & Time (+00:00) Priority Main Affected objects Text
========================================================
1 1 2018-07-30T07:40:23 LOW val/s1 val/s0; Temperature exceded the limit
======================================================== 
............
............

编辑:

有关更多信息,请参阅perlretut,尤其是。有关named capturesnamed patterns的部分。

如果有兴趣的话:达米安大帝为何要everything you knew about regular expressions is wrong

本文链接:https://www.f2er.com/3030927.html

大家都在问