说,我把这些数据放在一个文件中:
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/);
}
}
它对我不起作用。非常感谢任何建议和帮助。
答案 0 :(得分:3)
我建议你使用下面编码的算法
逐行读取文件,累计每个值
到数组@item
。
如果某行包含start
或end
,那么它将被视为边界,而不是添加到@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'
]
];