A bookkeeping thing to take care of here is opening and writing of individual files. The processing itself is handled by the range operator.
use warnings;
use strict;
my @files = @ARGV;
my ($fh_in, $fh_out);
foreach my $file (@files)
{
my $outfile = "new_$file";
open $fh_in, '<', $file or die "Can't open $file: $!";
open $fh_out, '>', $outfile or die "Can't open $outfile: $!";
print "Processing $file, writing to $outfile.\n";
while (<$fh_in>) {
print $fh_out $_ if not /^START$/ .. /^END$/;
}
}
This is invoked as script.pl file-list.
Since we use the same filehandle for reading (and the same one for writing), when a new file is opened the previous one is closed, see perlopentut and open. So we don't have to close
You don't have to close FILEHANDLE if you are immediately going to do another open on it, because open closes it for you. (See open.)
I name the new files as new_$file, just to provide a working sample. You could, for example, rename the old one to $file.orig and new one to $file instead, after the while loop. I'd use functions from the core File::Copy module for this. In this case we do need to close files explicitly first.