Don't open a new Filehandle for each match; instead, open one at the start, and just write a match to it
Try to eliminate the remaining foreach loop
Splitting the file up and processing it with multiple simultaneous processes isn't going to help much if you're reading off a single disk or a shared bus.