http://www.perlmonks.org?node_id=1057133


in reply to Re: Iterator to parse multiline string with \\n terminator
in thread Iterator to parse multiline string with \\n terminator

Neat! Thanks for the link.

I've been reading Higher Order Perl and was just reading the chapter on Lexers where MJD makes use of look-behind assertions. This actually helps make more sense of what I was reading.

What is the difference between next and redo in this context? A user below had a similar solution but used redo instead of next.

Replies are listed 'Best First'.
Re^3: Iterator to parse multiline string with \\n terminator
by smls (Friar) on Oct 06, 2013 at 11:47 UTC

    The difference is that redo does not re-evaluate the loop condition (in this case: "(<DATA>)", which fetches the next line) before evaluating the loop body again, whereas next does.

    This is why in jwkrahn's solution, the next line is fetched manually before calling redo:

    $_ .= <$fh>;

    The advantage of jwkrahn's solution with redo, is that the implicit variable $_ can be used to store the complete multiline record.

    The advantage of kcott's solution with next, is that there is only one place where the <> operator for fetching the next line is used (inside the loop condition) - but re-evaluating the the loop condition also resets $_, so in this case a custom variable needs to be declared above the loop to store the current record.