#!/usr/bin/perl -0 -CS use 5.010; use strict; use warnings; use Data::Dump 'pp'; my $HEADERMATCH = qr/ [a-z]+ (?: (?:-\w+)+ | \ by ) /ix; while (readline) { BLOCK: for (reverse split /\n\n/) { my @headers; LINE: for (split /\n/) { next if not /\S/; my @header = m{ ^ (? $HEADERMATCH) : \s* (? \S .+) $ }imx or next LINE; push @headers, \@header; } next BLOCK if not @headers; for (@headers) { say join ': ', @$_; } last BLOCK; } }