my @array; while () { last if /^d/ } #discard until the first match while () { if ( @array and /^d/ ) { process_array( @array ); undef @array; next; } push @array, $_; } #### my $data = join('',); my @chunk = split(/^\d/m, $data); foreach (@chunk) { process_array( split(/\n/s, $_) ) }