如何根据模式将输出文件拆分为多个块

时间:2012-05-17 10:30:47

标签: perl

我有一个包含以下内容的输出文件。我想基于“模式”将其拆分为块并存储在数组中。

Sample output:
100 pattern
line 1
line 2
line 3
101 pattern
line 4
102 pattern   
line 5
line 6
 ...   

n th 和( n +1) th 出现的“模式”之间的内容是一个块:

Block 1:
100 pattern
line 1
line 2
line 3

Block 2:
101 pattern
line 4


Block 3:
102 pattern   
line 5
line 6

基本上我正在寻找跨行的模式,并将其中的内容存储到数组中。

请告诉我如何在perl中实现

2 个答案:

答案 0 :(得分:3)

假设您的模式是包含单词pattern的全行(而普通行没有),并且您希望数组元素是整个块:

my @array;
my $i = 0;

for my $line ( <DATA> ) {
    $i++ if ( $line =~ /pattern/ );
    $array[$i] .= $line;
}

shift @array unless defined $array[0];  # if the first line matched the pattern

答案 1 :(得分:1)

我知道你已经接受了答案,但我想通过阅读数据并使用正则表达式来分解它来展示你如何做到这一点。

#!/usr/bin/perl

use strict;
use warnings;

use 5.010;

my $input = do { local $/; <DATA> };

my @input = split /(?=\d+ pattern)/, $input;

foreach (0 .. $#input) {
  say "Record $_ is: $input[$_]";
}

__DATA__
100 pattern
line 1
line 2
line 3
101 pattern
line 4
102 pattern   
line 5
line 6