2
substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ';
 shift; # package
 ....
 ....
ESQ

这个 ESQ 是什么,它在这里做什么?请帮助我理解这些陈述。

4

2 回答 2

10

它标志着here-doc section的结束。

EOF 虽然比 ESQ 更传统。

于 2010-08-05T12:19:19.640 回答
1

这种结构称为 here-doc(因为您从此处的文档而不是某处文件系统上的外部文档获取标准输入)。

它基本上读取从下一行到但不包括结束标记行的所有内容,并将其用作您正在运行的程序或命令的标准输入。结束标记线由 . 后面的文本控制<<

例如,在bash(我比 Perl 更熟悉)中,命令:

cat <<EOF
hello
goodbye
EOF

将运行cat,然后将两行发送到其标准输入(hello 和 goodbye 行)。Perl 也有这个特性,尽管语法略有不同(正如你所期望的,因为它是一种不同的语言)。尽管如此,它仍然足够接近解释仍然成立。

Wikipedia 有一个条目,如果您知道它被称为 here-doc,您可能会发现它,但否则很难弄清楚。

您基本上可以使用任何合适的标记。例如,如果您的输入行之一是EOF,则您不能真正将其用作标记,因为标准输入会过早终止:

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

在这种情况下,您可以使用DONE(或任何其他没有出现在文本中单独一行的内容)。

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

如果您转到该perlop页面并搜索<<EOF,希望一切都会变得清晰。

于 2012-08-14T19:58:10.093 回答