use strict; use warnings; use Data::Dumper; my $keyword; my %text_of; while () { if ( defined $keyword && /^={8}\Q$keyword\E_END={5}/ ) { undef $keyword; next; } if ( /^={8}([^=]+)={5}/ ) { $keyword = $1; next; } $text_of{ $keyword } .= $_ if defined $keyword; } print Dumper \%text_of; __DATA__ ========KEYWORD 1=========== key 1 Text 1 key 1 text 2 key 1 text 3 ========KEYWORD 1_END======= ========KEYWORD 2=========== key 2 Text 1 key 2 text 2 key 2 text 3 ========KEYWORD 2_END======= ========KEYWORD 3=========== key 3 Text 1 key 3 text 2 key 3 text 3 ========KEYWORD 3_END=======