in reply to Why does my Perl regex substitution for linebreak fail?

my $lines = join "", <DATA>; $lines =~ s/\n\n=/=/gm; print $lines; __DATA__ line 1 ====== line after break line

Produces:

line 1====== line after break line

That's what I'd expect, but maybe it's not what you wanted.

If you want to remove a blank line before the marker, do s/\n\n=/\n=/gm. Then the output is:

line 1 ====== line after break line

You can do s/\n=/=/gm (which sounds like what you describe), but that will produce output like the first output when there's no blank line before the marker.

As an aside, you can avoid reading in the whole file by setting the input record separator.

$/ = '='; while (<DATA>) { s/\n\n=/\n=/m; print; } __DATA__ line 1 ====== line after break line

Produces...

line 1 ====== line after break line

See perlvar for info about $/ (aka $INPUT_RECORD_SEPARATOR if you use English).

Replies are listed 'Best First'.
Re^2: Why does my Perl regex substitution for linebreak fail?
by ikegami (Patriarch) on Mar 06, 2008 at 02:55 UTC
    The m modifier is useless since ^, $, etc isn't used. In fact, why aren't you using \z when you change the IRS? And why not use "\n\n=" as the IRS?
    local $/ = "\n\n="; while (<DATA>) { s/\n\n=\z/\n=/; print; }
Re^2: Why does my Perl regex substitution for linebreak fail?
by ack (Deacon) on Mar 06, 2008 at 03:43 UTC

    I agree. The original regex, as posed by pat mc, removes both \n rather than just the single one that pac mc said was wanted to be removed.

    I also presume that pat mc (based upon the inquiry) is looking for regex solutions; but several of the other nodelets in this thread have some good ideas for alternativies to the regex approach.

    ack Albuquerque, NM
Re^2: Why does my Perl regex substitution for linebreak fail?
by pat_mc (Pilgrim) on Mar 06, 2008 at 09:10 UTC
    Thanks, kyle, for drawing my attention to the use of the IRS, an aspect of file handling in Perl I was unaware of so far.