Very nice, concise overview. A couple of additional notes to keep in mind regarding here docs:
-
The end tag specifier must follow the << without any intermediate space.
If the end tag is quoted explicitly (with either single or double quotes), spaces may be present:
print << "ENDTAG"; # works
print << 'ENDTAG'; # works
print << ENDTAG; # syntax error!
-
Any leading spaces in the text of the here doc will be printed as such, which means using here docs in indented blocks gets messy:
Non-indented code block
print "printing here doc:\n";
print <<"ENDTAG";
This text has 0 leading spaces
This text has 4 leading spaces
ENDTAG
OUTPUT:
printing here doc:
This text has 0 leading spaces
This text has 4 leading spaces
Indented code block (same output as above)
{
print "printing here doc:\n";
print <<"ENDTAG";
This text has 0 leading spaces
This text has 4 leading spaces
ENDTAG
}
But, if the printed text includes leading whitespace, spaces can be included as part of the end tag to clean up the code block:
{
print "printing here doc:\n";
print <<" ENDTAG";
This text has 4 leading spaces
ENDTAG
}
OUTPUT:
printing here doc:
This text has 4 leading spaces
-
The Filter::Indent::HereDoc and Filter::HereDocIndent modules allow here docs to be used within indented code blocks without adding the leading whitespace from the indentation to the output.