print <<EOF
stuff
EOF
;
print <<EOF;
stuff
EOF
为什么要使用一个而不是另一个?
答案 0 :(得分:14)
这两个例子在行为上是相同的,但考虑一下你是否想在打印该块之后再做其他事情:
print <<EOF
stuff
EOF
. "more text here";
...或者您可能需要测试操作的结果:
print $unstable_filehandle <<EOF
stuff
EOF
or warn "That filehandle finally disappeared: $!";
这些例子都是人为设计的,但你可以看一下,如果能够灵活地了解文本块后面的代码是多么有用。
答案 1 :(得分:9)
正如tchrist指出的那样,大多数人忽略的一件事是heredoc运算符在终止代码之后采用任意perl代码。
这意味着您可以(可以说)进行更自然的操作,例如:
my $obj = Foo::Bar->new(content => <<EOP)->do_stuff->sprint();
This is my content
It's from a heredoc.
EOP
一个结果是你可以把它们堆得更多(在我看来),而不是“未堆叠”:
-- stacked_heredoc.pl
#!/usr/bin/perl
use strict;
use warnings;
print join(<<JOINER, split("\n", <<SOURCE));
------------------------------
JOINER
This is my text
this is my other text
a third line will get divided!
SOURCE
反对一个未被堆积的heredoc ...
-- unstacked_heredoc.pl
#!/usr/bin/perl
use strict;
use warnings;
my $joiner = <<JOINER
------------------------------
JOINER
;
my $source = <<SOURCE
This is my text
this is my other text
a third line will get divided!
SOURCE
;
print join($joiner, split("\n", $source));
答案 2 :(得分:4)
你应该将heredoc令牌与它们所在的字符串文字完全一样。在内容之后,不要延迟进一步的标点符号或语法。这是误导和容易出错的。以下是从实际代码中获取的十个示例:
($is_a_valid_rfc_822_addr = <<'EOSCARY') =~ s/\n//g;
$eval = (($Preamble=<<'END1') . $userstuff . <<'END2');
for my $line (<<"End_of_Property_List" =~ m{ \S .* \S }gx) {
$cases .= <<"EDQ" if $timeout;
($is_a_valid_rfc_822_addr = <<'EOSCARY') =~ s/\n//g;
eval (($Preamble=<<'END1') . $_[0] . <<'END2');
@changes = split("\n", <<"EOCHANGES");
$change .= sprintf(<<"EOP", $in, $out, $in, $out);
eval "{ package $package; " . <<'EOF' . "}";
push @args, dequeue('|Q|', <<'END_OF_ASTRAL_MATCH') if $Opt{astral};
看看它是如何工作的?
答案 3 :(得分:2)
FWIW, Perl最佳实践建议:
print <<'EOF';
stuff
EOF
答案 4 :(得分:1)
Randal Schwartz在这里有一篇很好的文章HERE。
这里有几件事需要记住:
;
是语句终止符,是所有Perl语句(有一些例外)所必需的,包括此处的文档字符串; 引自perldoc -q "HERE documents"
(和perlfaq4):
&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;一部分。强>
[可能]应该是<<
部分结尾处的分号。
您不能(轻松)在代码前面留出任何空间。
您拥有的两种形式在功能上是等同的。正如{ ... } if (blah blah)
与if (blah blah) { ... }
相同。虽然这两个陈述在功能上是等同的,但它们“阅读”的方式不同。
这些文件中的每一个都是等效且有效的Perl文件:
my %data = <<END
fred: Fred Flintstone
barney: Barney Rubble
betty: Betty Rubble
wilma: Wilma Flintstone
END
=~ /(\w+): (.*)/g;
和
my %data = <<END =~ /(\w+): (.*)/g;
fred: Fred Flintstone
barney: Barney Rubble
betty: Betty Rubble
wilma: Wilma Flintstone
END
# You must have a CR after the "END". Can't be EOF...
两者都为Flintstones设置%data
哈希值为first=>"full name"
。您希望在代码中看到哪些内容?
注意第二种形式是有一个问题的形式:在终止标记后需要有文字或空格,或者你可能会Can't find string terminator "END" anywhere before EOF
我认为这就是为什么你看到单独的;
有些人在这里的文档。
恕我直言,;
属于此doc标签的第一个实例或其后的代码。如果它在结束标记之后,则更难阅读。 除非结束标记的形式类似于语句修饰符或警告或骰子逻辑。这只是我的个人风格指南。