#!/usr/bin/env perl use strict; use warnings; open(my $infh, '<', 'testdat.dat') or die $!; my $outfh; my $filecount = 0; while ( my $line = <$infh> ) { if ( $line =~ /^zone>\s*(\w+\W+(\w+)\s*$)/ ) { close($outfh) if $outfh; $outfh = $2; open($outfh, '>', sprintf($outfh'.txt', ++$filecount)) or die $!; } print {$outfh} $line or die "Failed to write to file: $!"; } close($outfh); close($infh); Datafile = zone 1filea 1ss record1a record1b record1c record 1d 2 record empty endoffile zone 2fileb 1ss record1a record1b record1c record 1d 2 record empty endoffile