Perl将数据存储在数组中文件的特定行之间

时间:2015-09-19 16:41:39

标签: perl

说,我把这些数据放在一个文件中:

start
1
5
6
start
4
5
start
6
end

我希望这些数据存储在像

这样的数组中
([1,5,6],[4,5],[6])

我用触发器操作器尝试了它:

if(/start/../start/){
                my $line=<DATA>;
                print "$line \n";
                push(@data,$line) if($line=~/start/);
        }
}

它对我不起作用。非常感谢任何建议和帮助。

2 个答案:

答案 0 :(得分:3)

我建议你使用下面编码的算法

逐行读取文件,累计每个值 到数组@item。 如果某行包含startend,那么它将被视为边界,而不是添加到@item,而是将其内容作为块复制到@data;然后@item被清空

use strict;
use warnings;

my (@data, @item);

while ( <DATA> ) {

    chomp;

    if ( /start|end/ ) {
        if ( @item ) {
            push @data, [ @item ];
            @item = ();
        }
    }
    else {
        push @item, $_;
    }
}

use Data::Dump;
dd \@data;

__DATA__
start
1
5
6
start
4
5
start
6
end

输出

[[1, 5, 6], [4, 5], [6]]

答案 1 :(得分:0)

我可能不会使用范围运算符,而是将$/设置为start\n

E.G。

local $/ = "start\n";
my @stuff;
while ( <DATA>) {
     my @chunk = m/(\d+)/gm;
     push ( @stuff, \@chunk) if @chunk;
}
print Dumper \@stuff ;

无论如何都是这样的。

输出

$VAR1 = [
          [
            '1',
            '5',
            '6'
          ],
          [
            '4',
            '5'
          ],
          [
            '6'
          ]
        ];