简体   繁体   中英

Perl: RegEx: Storing variable lines in array

I'm developing a Perl script and one of the script functions is to detect many lines of data between two terminals and store them in an array. I need to store all lines in an array but to be grouped separately as 1st line in $1 and 2nd in $2 and so on. The problem here is that number of these lines is variable and will change with each new run.

my @statistics_of_layers_var;
for( <ALL_FILE> ) {
   @statistics_of_layers_var = ($all_file =~ /(Statistics\s+Of\s+Layers)
   (?:(\n|.)*)(Summary)/gm );
   print @statistics_of_layers_var;

The given data should be

Statistics Of Layers
Line#1
Line#2
Line#3
...
Summary

How I could achieve it?

You can achieve this without a complicated regular expression. Simply use the range operator (also called flip-flop operator) to find the lines you want.

use strict;
use warnings;
use Data::Printer;

my @statistics_of_layers_var;
while (<DATA>) {
    # use the range-operator to find lines with start and end flag
    if (/^Statistics Of Layers/ .. /^Summary/) {
        # but do not keep the start and the end
        next if m/^Statistics Of Layers/ || m/^Summary/;
        # add the line to the collection
        push @statistics_of_layers_var, $_ ;
    }
}

p @statistics_of_layers_var;

__DATA__
Some Data
Statistics Of Layers
Line#1
Line#2
Line#3
...
Summary
Some more data

It works by looking at the current line and flipps the block on and off. If /^Statistics of Layers/ matches the line it will run the block for each following line until the `/^Summary/ matches a line. Because those start and end lines are included we need to skip them when adding lines to the array.

This also works if your file contains multiple intances of this pattern. Then you'd get all of the lines in the array.

Maybe you can try this :

push  @statistics_of_layers_var ,[$a] = ($slurp =~ /(Statistics\s+Of\s+Layers)
(?:(\n|.)*)(Summary)/gm );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM