Connecting rows in Perl after filter

74 Views Asked by At

I want ask you for some tips. My code looks like next few rows:

#!/usr/bin/env perl

while (<DATA>) {
 if (/\bSTART\b/ .. /\bEND\b/) {
    #$together = $_;
    #$together = chomp ($_);  
    print ($_, "\n");   
 }
}

__DATA__
rubish
rub
START Data Data Data start 15.05.2015 Data i want end Data 
END
rubishend

*****************
example:
START new line 1 line 2new line 3 END
*****************

My goal is to filter many line log. Output is one or two lines matching regex. But output can be one-line --> It´s what I want. Or two-line, in this case I need to join second line to the end of first. Output from my code looks like:

START Data Data Data start 15.05.2015 Data i want end Data 
END
START new line 1 line 2new line 3 END

What I want is:

START Data Data Data start 15.05.2015 Data i want end Data END
START new line 1 line 2new line 3 END

Any tips how to distinguish two line output and connect it into one line? For better parsing in next steps? Thanks for answer

1

There are 1 best solutions below

0
On BEST ANSWER

From flip-flop operator's documentation:

The value returned is either the empty string for false, or a sequence number (beginning with 1) for true. [...] The final sequence number in a range has the string "E0" appended to it

So,

while (<DATA>) {
   if (my $i = /\bSTART\b/ .. /\bEND\b/) {
      s/\n/ / if $i !~ /E0\z/; 
      print;
   }
}

Without the flip-flop operator:

my $in = 0;
while (<DATA>) {
   if ($in ||= /\bSTART\b/) {
      if (/\bEND\b/) {
         $in = 0;
      } else {
         s/\n/ /;
      }
      print;
   }
}