我可以使用here文档附加到字符串吗?

时间:2011-03-29 20:01:53

标签: perl heredoc

我有一个字符串,我想附加一块格式化的SQL。有没有办法使用这里的文件追加?或者我是否需要使用here文档创建一个新字符串并将其附加到现有字符串?

3 个答案:

答案 0 :(得分:5)

你可能会说

    $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;会丢失此处文档的内容。)

答案 1 :(得分:2)

是的,你可以。

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

输出:

Line 1
Line 2
Line 3
select something

答案 2 :(得分: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,直到找到结束标记。一旦找到在该行上启动的所有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,则首先将heredoc分配给变量,然后在表达式中使用该变量。