use strict; my $filename = "file.name"; # or whatever my $obj_count = 0; open( FILE, "<", $filename ) or die "$filename: $!\n"; while () { $obj_count++ if /^SS/; } close FILE; my $part_count = get_some_number(); # depends on ... (command line? DB?) my $obj_per_part = $obj_count / $part_count; my $break_at_obj = $obj_per_part; open( FILE, "<", $filename ); my $o_index = sprintf( "%03d", 1 ); open( OUT, ">", "$filename.$o_index" ) or die "$filename.$o_index: $!\n"; my $obj_done = 0; while () { if ( /^SS/ ) { if ( $obj_done > $break_at_obj ) { close OUT; $o_index++; open( OUT, ">", "$filename.$o_index" ) or die "$filename.$o_index: $!\n"; $break_at_obj += $obj_per_part; } $obj_done++; } print OUT; }