2012-08-14 262 views
7

可能重复:
Help me understand this Perl statement with <<'ESQ'什么是print << EOF;它是如何工作的?

什么是https://stackoverflow.com/questions/4151279/perl-print-eof声明做什么呢?我遇到了上一篇文章,但不明白他想要解释什么。那是什么PETE?任何人都可以解释每一行?代码如何工作?

print <<EOF; 
This is 
a multiline 
string 
EOF 

print <<PETE; 
This is 
a multiline 
string 
PETE 

这两者有什么区别和相似之处?代替PETE我已经使用了许多其他的词,如DOG,它的作品每次都是一样的。

回答

20

这被称为here-doc。它基本上抓住了从下一行开始直到结束标记行的所有内容,并将其作为正在运行的程序的标准输入。结束标记线由<<之后的文本控制。

作为一个例子,在bash(其中我更熟悉比Perl),命令:

cat <<EOF 
hello 
goodbye 
EOF 

将运行cat然后发送两行它的标准输入(问候和再见线)。 Perl也有这个特性,尽管语法略有不同(正如你所期待的那样,因为它是一种不同的语言)。尽管如此,它仍然足以让解释依然成立。

维基百科有an entry for this,你可能会发现你知道它被称为here-doc,但否则这将是很难弄清楚。

在您的具体情况下,使用EOFPETE没有区别,heredoc标记(<<后面的位)与标准输入结束之间有关系。

例如,如果你输入线之一是EOF,你不能真正使用,作为一个标志,因为标准输入将被提前终止:

cat <<EOF 
This section contains the line ... 
EOF 
but then has more stuff 
and this line following is the real ... 
EOF 

在这种情况下,你可以使用PETE (或其他任何没有出现在文本中的行)。

还有其他选项,例如在标记周围使用引号(所以缩进看起来更好)以及使用单引号或双引号来控制变量替换。

如果您转到perlop页面并搜索<<EOF,它将有希望变得清晰。