http://qs321.pair.com?node_id=686019


in reply to Why do here-docs have to end with a newline, not EOF?

Why is this?
Because The Free Manual says so. According to perlop (search for <<EOF):
If the terminating identifier is on the last line of the program, you must be sure there is a newline after it; otherwise, Perl will give the warning Can't find string terminator "END" anywhere before EOF....
  • Comment on Re: Why do here-docs have to end with a newline, not EOF?

Replies are listed 'Best First'.
Re^2: Why do here-docs have to end with a newline, not EOF?
by Cody Pendant (Prior) on May 12, 2008 at 01:44 UTC
    If the terminating identifier is on the last line of the program, you must be sure there is a newline after it
    ...but if there's a newline, then it isn't the last line, is it? Something of a documentation bug there. It would be better expressed as "the terminating identifier isn't allowed to be the last line".


    Nobody says perl looks like line-noise any more
    kids today don't know what line-noise IS ...
      ...but if there's a newline, then it isn't the last line, is it?

      Newline is traditionally a line terminator not a line separator. But even if you consider newline a line separator, then it is still a bit of a stretch to call the 0 characters after the final newline "a line". I think you have been mislead by quirks of notepad (or its kin) which shows space for a line below the last line since that space is where the cursor goes when you press the final ENTER.

      Certainly, <> won't read "a line" after a final newline in a file (it won't read anything, other than "end of file"). Now, if the last newline in a file is followed by more characters, then the historical view would be to consider that "a partial line" or "an unterminated line" or similar terminology. Traditionally, vi would refuse to create such files and if you used vi to edit such a file and saved any changes, vi would add a final newline silently (this has changed with newer vi replacements like, for example, vim).

      It would be better expressed as "the terminating identifier isn't allowed to be the last line".

      Better to change the verbage to not rely on either view of what "last line" means. Perhaps:

      If the terminating identifier is at the very end of the program without even a newline after it, then Perl will give the warning Can't find string terminator "END" anywhere before EOF. So be sure to include a newline immediately after the terminating identifier.

      - tye