in reply to matching and writing multiple line blocks

I'm a bit confused by your post. Do you already know what the repeating block looks like? Or are you trying to detect repeat blocks? And if you are looking for repeat blocks, do you know the end points? Are they always, "Experiment" and "Reagent Lots" ??

# 1. open the file open FILEHANDLE, $filename or die $!; # 2. look for my first repeated block while( <FILEHANDLE> ) { if( /(some-regex-for-the-repeat-block)/ ) { # 3. save this first repeated block to a variable (which is best?) # 4. open the first output file open TEMP, "> $outfile" or die $!; # 5. write the code to this file and close it print TEMP $1, $/; close TEMP or die $!; # 6. repeat to end of file }
Another idea might be to undef $/ so that you can read the infile as a scalar and apply your regex to the whole thing:
{ # note the {} brackets. This concerns the scope of the next line. local $/; # sets $/ = undef for this block only. open FH, $infile or die $!; $_ = <FH>; # Reads the entire file into memory. close FH or die $!; @_ = m/(some-regex-for-the-block)/gm; } # now @_ contains an array of matches for the regex. # write each one to a different file: my $filenum = 0; for( @_ ) { ++$filenum; open FH, ">MATCH$filenum" or die "Failed to open MATCH$filenum, $! +"; print FH $_, $/; close FH or die $!; }