Могу ли я использовать здесь документ, чтобы добавить к строке? - PullRequest
2 голосов
/ 30 марта 2011

У меня есть строка, к которой я хочу добавить блок отформатированного SQL. Есть ли способ добавить, используя здесь документ? Или мне нужно создать новую строку, используя документ здесь, и добавить ее к существующей строке?

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Вы могли бы, вероятно, сказать

    $str = <<EOH;
$str
more stuff here
EOH

, но Perl оптимизирует это до

    $str .= <<EOH;
more stuff here
EOH

Вам не нужно устанавливать отдельную переменную, как в

    $str1 = <<EOH;
more stuff here
EOH
    $str .= $str1;

;даже в старых Perls предыдущие два должны работать нормально (в то время как в очень старом Perl 5 были некоторые случаи, которые не работали, в частности, print <<EOH; потерял бы содержимое документа здесь).

2 голосов
/ 30 марта 2011

Здесь документы очень гибкие, и их можно использовать в большинстве случаев, если бы вы использовали обычный строковый литерал. Они могут использоваться как часть вызова функции или составного выражения.

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 переменной и используйте эту переменную в выражении.

2 голосов
/ 30 марта 2011

Да, вы можете.

$sql = "select something";
print <<END
Line 1
Line 2
Line 3
END
. $sql;

выходы:

Line 1
Line 2
Line 3
select something
...