Здесь документы очень гибкие, и их можно использовать в большинстве случаев, если бы вы использовали обычный строковый литерал. Они могут использоваться как часть вызова функции или составного выражения.
my $inner_str = 'middle text';
my $full_str = <<FIRST_BLOCK . "$inner_str\n" . <<SECOND_BLOCK;
This text is at the start of the string.
And so is this.
FIRST_BLOCK
This text ends the first assignment to the string.
SECOND_BLOCK
Правила, которые Perl использует для синтаксического анализа heredoc, допускают очень странное поведение, когда при обнаружении heredoc текущая строка будет анализироваться до тех пор, пока эта строка не закончится. Затем Perl прекратит синтаксический анализ текущего выражения и начнет читать heredoc, пока if не найдет маркер конца. Как только он найдет конечные токены для всех heredoc, которые были запущены в этой строке, он возобновит синтаксический анализ, как если бы в выражении не было прерывания.
$full_str .= <<THIRD_BLOCK . "$inner_str
This text is "appended" to the string.
THIRD_BLOCK
" . <<LAST_BLOCK;
This text ends the string.
LAST_BLOCK
print $full_str;
Обратите внимание, что строка начинается перед телом heredoc THIRD_BLOCK и заканчивается после heredoc THIRD_BLOCK, но не включает ее содержимое.
Хотя вы можете быть очень гибкими с синтаксисом heredoc, я рекомендую использовать только один heredoc для каждого выражения, сохраняйте выражение простым. Если вам нужно несколько heredoc в одном выражении или один в сложном выражении, то сначала присвойте heredoc переменной и используйте эту переменную в выражении.