substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ';
shift; # package
....
....
ESQ
什么是这个ESQ,它在这里做什么?请帮我理解这些陈述。帮我通过<<'ESQ'了解这个Perl语句
substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ';
shift; # package
....
....
ESQ
什么是这个ESQ,它在这里做什么?请帮我理解这些陈述。帮我通过<<'ESQ'了解这个Perl语句
它标志着here-doc section的结束。
虽然EOF比ESQ更传统。
此构造被称为here-doc(因为您从文档(这里是)获取标准输入,而不是某处的文件系统上的外部文档)。
它基本上读取下一行中的所有内容,但不包括结束标记行,并将其用作正在运行的程序或命令的标准输入。结束标记线由<<
之后的文本控制。
作为一个例子,在bash
(其中我更熟悉比Perl),命令:
cat <<EOF
hello
goodbye
EOF
将运行cat
然后发送两行它的标准输入(问候和再见线)。 Perl也有这个特性,尽管语法略有不同(正如你所期待的那样,因为它是一种不同的语言)。尽管如此,它仍然足以让解释依然成立。
维基百科有an entry for this你可能会发现,如果你知道它被称为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
,它将有希望变得清晰。
我想你是指EOD? – ysth 2010-08-05 15:28:32
我经常使用'EOF'。 – Ether 2010-08-05 16:36:36
我通常会看到许多匹配'/^EO [AZ] + $ /',文件结束和数据结束的变体,看起来似乎最常见,但同时也很好地提供了一些关于你的结局的更多帮助。 – 2010-08-05 19:36:12