I'm sure someone will post an efficient regex, but in the meantime
you can try this. Still a bit ugly, lines are joined then split on
the HR tags.
YuckFoo
#!/usr/bin/perl
use strict;
my ($line, @keep);
for $line ((split(/<HR>\s+/s, join('', (<DATA>))))) {
if ($line =~ m{\d+\s+is\s+good}) { push (@keep, $line); }
}
for $line (@keep) { print "$line\n"; }
__DATA__
<HR>
1 is good<BR>
useless data<BR>
useless data<BR>
useless data<BR>
useless data<BR>
<HR>
2 is not good <BR>
useless data<BR>
useless data<BR>
useless data<BR>
useless data<BR>
<HR>
3 is good<BR>
useless data<BR>
useless data<BR>
useless data<BR>
useless data<BR>
<HR>
4 is not good <BR>
useless data<BR>
useless data<BR>
useless data<BR>
useless data<BR>
<HR>