我正在开发一个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
我怎么能实现它?
答案 0 :(得分:2)
无需复杂的正则表达式即可实现此目的。只需使用range operator(也称为触发器操作符)来查找所需的行。
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 /匹配一行。因为包含了这些起始行和结束行,所以在向数组添加行时需要跳过它们。
如果您的文件包含此模式的多个内容,这也适用。然后你就可以获得数组中的所有行。
答案 1 :(得分:0)
也许你可以试试这个:
push @statistics_of_layers_var ,[$a] = ($slurp =~ /(Statistics\s+Of\s+Layers)
(?:(\n|.)*)(Summary)/gm );