$/ = ""; # input record separator set to empty string my $last_rec; while (<>) { # each record is terminated by /\n{2,}/ if ( /^def/ ) { print $last_rec.$_ if ( $last_rec ); } else { $last_rec = $_; } } #### $/ = ""; my $last_prefix = my $last_target = ''; while (<>) { if ( /^abc/ ) { print $last_prefix.$last_target if ( $last_target ); $last_prefix = $_; $last_target = ''; } elsif ( /^def/ ) { $last_target = $_; } elsif ( $last_target ) { $last_target .= $_; } elsif ( $last_prefix ) { $last_prefix .= $_; } }