use warnings; use strict; my $file = 'in.txt'; my ($start,$end); open my $fh, '<:raw', $file or die "$file: $!"; my $offset = 0; while (<$fh>) { $start = $offset if /PATTERN1/; $offset = tell $fh or die "tell: $!"; $end = $offset if /PATTERN3/; } die "Failed to find second pattern after first pattern" unless defined $start && defined $end && $end > $start; seek $fh, $start, 0 or die "seek: $!"; my $bytes = $end-$start; read($fh, my $data, $bytes)==$bytes or die "failed to read $bytes bytes"; close $fh; print $data;