我看到一个here-document用作参数,里面有方括号运算符。看起来像是:
method(<<EOF)[0][0]
lots of text
EOF
方括号运算符的含义是什么?有谁知道那是什么样的成语?
答案 0 :(得分:9)
问题在于heredocs有一些混乱的结构会破坏正常的代码流。 heredoc的内容在打开heredoc的<<EOF
之后立即开始,并在关闭heredoc的EOF
结束,但包含heredoc的表达式从正常情况下从左到右继续。
结构:
method(<<EOF)[0][0]
lots of text
EOF
实际上更像是这样:
/<<EOF \
|lots of text|
|lots of text|
method|lots of text|[0][0]
|lots of text|
|lots of text|
\EOF /
斜线和竖条是粗略尝试绘制非常高的ASCII艺术括号;或者,如果你有一个合适的unicode字体:
⎛<<EOF ⎞
⎜lots of text⎟
⎜lots of text⎟
method⎜lots of text⎟[0][0]
⎜lots of text⎟
⎜lots of text⎟
⎝EOF ⎠
你可以把heredocs想象成一个看起来很滑稽的双引号(或%Q(...)
,如果你愿意的话),它是垂直的而不是像你的其他代码一样水平。
(IMO)会更加一致地写作:
method(<<EOF
lots of text
EOF)[0][0]
但是heredocs有着悠久的历史(一直追溯到/bin/sh
)我们一直坚持下去。
回到真正的问题:该表达式的[0][0]
部分根本不在heredoc中,只是应用于method("lots of text\nlots of text\n...")
返回的内容。