【问题标题】:Help me understand this Perl statement with <<'ESQ'用 <<'ESQ' 帮助我理解这个 Perl 语句
【发布时间】:2011-03-25 18:40:34
【问题描述】:
substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ';
 shift; # package
 ....
 ....
ESQ

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

【问题讨论】:

    标签: perl heredoc


    【解决方案1】:

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

    不过,EOF 比 ESQ 更传统。

    【讨论】:

    • 我通常会看到许多与/^EO[A-Z]+$/、文件结尾和数据结尾相匹配的变体,这似乎是最常见的,但也很高兴为您的结尾提供更多帮助。
    • 我喜欢ENDEND_DESCRIPTIVE_NAME,其中_DESCRIPTIVE_NAME 是对内容的描述。例如,END_HTML 如果我有一个 html 片段或END_ICON 如果我在 gui 中嵌入一个编码图标。
    • 还要注意here-doc被分配到$obj_strptime中的指定位置(index($strptime,"sub")+6)。
    【解决方案2】:

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

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

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

    cat <<EOF
    hello
    goodbye
    EOF
    

    将运行cat,然后将两行发送到其标准输入(hello 和goodbye 行)。 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页面搜索&lt;&lt;EOF,希望一切都会变得清晰。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2016-07-08
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多