您的记录分隔符应该是"\n\n"
. 每行都以一个结尾,并且您可以通过双换行符来区分一个块。使用这个想法,很容易过滤掉具有属性 4 的块。
use strict;
use warnings;
use English qw<$RS>;
open( my $inh, ... ) or die "I'm dead!";
local $RS = "\n\n";
while ( my $block = <$inh> ) {
if ( my ( $prop4 ) = $block =~ m/^Property 4:\s+(.*)/m ) {
...
}
if ( my ( $prop3, $prop6 )
= $block =~ m/
^Property \s+ 3: \s+ ([^\n]*)
.*?
^Property \s+ 6: \s+ ([^\n]*)
/smx
) {
...
}
}
两个表达式都使用多行 ('m') 标志,因此^
适用于任何行开头。最后一个使用标志在 '.' 中包含换行符。表达式 ('s') 和扩展语法 ('x'),其中包括忽略表达式中的空格。
如果数据相当小,您可以一次性处理所有数据,例如:
use strict;
use warnings;
use English qw<$RS>;
local $RS = "\n\n";
my @block
= map { { m/^Property \s+ (\d+): \s+ (.*?\S) \s+/gmx } } <DATA>
;
print Data::Dumper->Dump( [ \@block ], [ '*block' ] ), "\n";
这表明结果是:
@block = (
{
'1' => '1234',
'3' => 'ACBGD',
'2' => '34546'
},
{
'4' => '4567',
'1' => '1234'
},
{
'6' => 'example',
'1' => 'just',
'3' => 'an',
'5' => 'simple'
}
);