in reply to codeperl -pe 's/\n/" " . /e' data/code

I'm sure the author will be able to explain it better, but here it goes: This makes more sense with an example. Let's say you have the file:
one two three four
And run it through the code above. Here's what happens:
  1. The "while(<>)" reads "one\n"
  2. The s substitutes the "\n" in "one\n" with a space followed by the next line in the file ("two\n"), so $_ now contains "one two\n".
  3. The implicit "print" (from the -p option) prints $_.
  4. Repeat.

--ZZamboni

Replies are listed 'Best First'.
RE: Re: codeperl -pe 's/\n/
by nuance (Hermit) on May 26, 2000 at 18:55 UTC
    while I have no doubt that this is basicaly correct, I'm not convinced that it's 100%

    My understanding of the situation is that the regular expression operator iterates over the entire string before it moves on to the "implicit" print. This makes the order

    1. The "while(<>)" reads "one\n"
    2. The s substitutes the "\n" in "one\n" with a space followed by the next line in the file ("two\n"), so $_ now contains "one two\n".
    3. Substitution operator now carries on examining $_, finds \n at the end "one two\n" etc.
    4. The implicit "print" (from the -p option) prints $_.

    If it did the print as step three, surely you would end up with

    one two
    three four

    Update nuance hangs his head in shame :-( I really will have to learn to read posts properly, of course the original node mentions joining pairs of lines. Doh!

    As you can all see, my understanding was wrong.

    Nuance

    Baldrick, you wouldn't see a subtle plan if it painted itself purple and danced naked on top of a harpsichord, singing "Subtle plans are here again!"

      The purpose of the snippet is precisely to join the lines of the file two at a time. So yes, the output you give is the one you get, but that is the intended effect. The -p adds an implicit print at each iteration of the implicit loop.
A reply falls below the community's threshold of quality. You may see it by logging in.