in reply to matching and writing multiple line blocks
Another idea might be to undef $/ so that you can read the infile as a scalar and apply your regex to the whole thing:# 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 }
{ # 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 $!; }
|
|---|