3

我有一个字符串,我想将一个格式化的 SQL 块附加到。有没有办法使用此处的文档进行附加?还是我需要使用此处的文档创建一个新字符串并将其附加到现有字符串?

4

3 回答 3

5

你可能会说

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

但是 Perl 将其优化为

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

您不需要像中那样设置单独的变量

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

; 即使在较旧的 Perl 中,前两个也应该可以正常工作(而在非常旧的 Perl 5 中,有些情况无法正常工作,尤其是print <<EOH;会丢失此处文档的内容)。

于 2011-03-29T20:08:33.937 回答
2

这里的文档非常灵活,可以在大多数情况下使用,您将使用普通的字符串文字。它们可以用作函数调用或复合表达式的一部分。

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,直到找到结束标记。一旦找到在该行开始的所有 heredocs 的结束标记,它将恢复解析,就好像表达式中没有中断一样。

$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,但请保持表达式简单。如果您在一个表达式中需要多个 heredocs 或在复杂表达式中需要一个,则首先将 heredoc 分配给一个变量并在表达式中使用该变量。

于 2011-03-30T16:05:03.177 回答
1

是的你可以。

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

输出:

Line 1
Line 2
Line 3
select something
于 2011-03-29T20:07:09.710 回答