perl here document
2014-02-19 14:02:06 阿炯

这种写法用于输出段落,段落中通常有变量需要被替换的工作,先看一下对here doc的定义。

here文档,又称作heredoc、hereis、here-字串或here-脚本,是一种在命令行shell和程序语言(中级)里定义一个字串的方法。它可以保存文字里面的换行或是缩排等空白字符,一些语言允许在字串里执行变量替换和命令替换。最通用的语法是<<紧跟一个标识符,从下一行开始是想要引用的文字,然后再在单独的一行用相同的标识符关闭。在Unix shell里,here文档通常用于给命令提供输入内容。

在Perl里有许多不同的方法使用here文档。在here文档的标签名前后加括号的效果和一般的字面字串效果是一样的:标签前后加双引号允许变量扩展,单引号则不行,不加引号的和加双引号的效果一样。加反引号将会把here文档当做shell脚本执行,并获取输出。需要保证结束标签必须在一行的开始,不然这个标签不会被直译器认出。

注意:here文档不是从标签开始的,而是从下一行开始的,所以包含标签的语句将会在标签后继续。


使用须知:
1.必须后接分号,否则编译通不过。
2.END可以用任意其它字符代替,只需保证结束标识与开始标识一致。
3.结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
4.开始标识可以不带引号号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
5.当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。

使用示例:
my $a = 10;
my $var = <<"EOF";
Here文档实例,使用双引号。
可以在这输入字符串和变量。
例如:a = $a++
EOF

print "$var\n";
 
$var = <<'EOF';
Here文档实例,使用单引号。
例如:a = $a
EOF

print "$var\n";


可以在同一行上开始多个here文档:

say(<<BEGIN . "this is the middle\n" . <<END);
This is the beginning:
BEGIN
And now it is over!
END
 
#上边的和这个相同:
say("This is the beginning:\nthis is the middle\nAnd now it is over!");

标签本身可以使用空格,这允许here文档不会破坏缩进。

  say <<'  END';
Hello World
  END
    
常见的cgi中用到的
print <<EOF;
Content-Type: text/html
<HTML>
<HEAD>
<TITLE>Hello World</TITLE>
</HEAD>
<BODY>
<H4>Hello World</H4>
<P>
Your IP Address is $ENV{REMOTE_ADDR}
</P>
</BODY>
</HTML>
EOF

或使用qq语法来实现。

my $html=qq{<HTML>\n<HEAD>\n<title>$title</title></head>};

print $html;

my $str = <<"END";
foo bar
baz
END
print $str;

$heredoc = <<END;
 Everything after the
 start of the
 here-doc is part of
 the string until we get at freeoa.net
 to the
END
print $heredoc;

my $string = <<'END THIS';
    foo
    bar
END THIS
#注意这种含空格的标记一定要位于一行的最开始处!

If you do not want your strings to be interpolated, surround the keyword with single quotes like so:
如果你不希望你的字符串内插,用单引号将关键字引起来:
print <<'HTML';

参考文档

Here文档

HERE documents