我有一个字符串,我想附加一块格式化的SQL。有没有办法使用这里的文件追加?或者我是否需要使用here文档创建一个新字符串并将其附加到现有字符串?
答案 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分配给变量,然后在表达式中使用该变量。