繁体   English   中英

Perl:RegEx:在数组中存储变量行

[英]Perl: RegEx: Storing variable lines in array

我正在开发一个Perl脚本,脚本功能之一是检测两个终端之间的多行数据并将它们存储在一个数组中。 我需要将所有行存储在数组中,但要分别分组为$1第一行和$2第二行,依此类推。 这里的问题是这些行的数量是可变的,并且每次新运行都会改变。

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;

给定的数据应为

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

我该如何实现?

您无需复杂的正则表达式即可实现此目的。 只需使用范围运算符 (也称为触发器运算符)来查找所需的行。

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

通过查看当前行并翻转该块来进行工作。 如果/^Statistics of Layers/匹配该行,它将为随后的每一行运行该块,直到`/ ^ Summary /匹配一行。 因为包含了这些开始和结束行,所以在向数组添加行时需要跳过它们。

如果您的文件包含该模式的多个实例,这也适用。 然后,您将获得数组中的所有行。

也许你可以试试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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