レコード区切り文字は"\n\n"
. すべての行は 1 で終わり、2 つの改行でブロックを区別します。このアイデアを使用すると、プロパティ 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'
}
);