use strict; use warnings; open my $dataFH, q{<}, \ <; }; close $dataFH or die qq{close: $!\n}; my $rxGroup = qr {(?xs) (library_[^\n]+)\n ([^\n]+)\n (.*?\n) (?=(?:library_|\z)) }; while ( $dataString =~ m{$rxGroup}g ) { print qq{$1:$2:$_\n} for split m{\n}, $3; }