4.11. Heredoc Terminators
You can use just about anything you like as a heredoc terminator. For example:
print <<'end list'; # Prints 3 lines then [DONE] get name set size put next end list print "[DONE]\n";
print <<''; # Prints 4 lines (up to the empty line) then [DONE] get name set size put next end list print "[DONE]\n";
print <<'print "[DONE]\n";'; # Prints 5 lines but no [DONE]! get name set size put next end list print "[DONE]\n";
Please don't. Heredocs are tough enough to understand as it is. Using bizarre terminators only makes them more difficult. It's a far better practice to stick with terminators that are capitalized (so they stand out better in mixed-case code) and free of whitespace (so only a single visual token has to be recognized).
For example, compared to the previous examples, it's much easier to tell what the contents of the following heredoc are:
print <<'END_LIST'; get name set size put next END_LIST
But even with a single identifier as terminator, both the contents and the termination marker of a heredoc still have to be left-justified. So it can still be difficult to detect the end of a heredoc. By naming every heredoc marker with a standard, easily recognized prefix, you can make them much easier to pick out.
'END_...' is the recommended choice for this prefix. That is, instead of:
Readonly my $USAGE => <<"USAGE"; Usage: $0 <file> [-full] [-o] [-beans] Options: -full : produce a full dump -o : dump in octal -beans : source is Java USAGE
delimit your heredocs like so:
Readonly my $USAGE => <<"END_USAGE"; Usage: $0 <file> [-full] [-o] [-beans] Options: -full : produce a full dump -o : dump in octal -beans : source is Java END_USAGE
It helps to think of the << heredoc introducer as being pronounced "Everything up to...", so that the previous code reads as: the read-only $USAGE variable is initialized with everything up to END_USAGE.