【问题标题】:Can I use a here document to append to a string?我可以使用此处的文档附加到字符串吗?
【发布时间】:2011-07-25 14:15:50
【问题描述】:

我有一个字符串,我想将一段格式化的 SQL 附加到该字符串。有没有办法使用此处的文档进行附加?还是我需要使用此处的文档创建一个新字符串并将其附加到现有字符串?

【问题讨论】:

    标签: perl heredoc


    【解决方案1】:

    是的,你可以。

    $sql = "select something";
    print <<END
    Line 1
    Line 2
    Line 3
    END
    . $sql;
    

    输出:

    Line 1
    Line 2
    Line 3
    select something
    

    【讨论】:

      【解决方案2】:

      你可能会说

          $str = <<EOH;
      $str
      more stuff here
      EOH
      

      但 Perl 将其优化为

          $str .= <<EOH;
      more stuff here
      EOH
      

      您不需要像中那样设置单独的变量

          $str1 = <<EOH;
      more stuff here
      EOH
          $str .= $str1;
      

      ;即使在较旧的 Perl 中,前两个也应该可以正常工作(而在非常旧的 Perl 5 中,有些情况无法正常工作,特别是 print &lt;&lt;EOH; 会丢失此处文档的内容)。

      【讨论】:

        【解决方案3】:

        这里的文档非常灵活,可以在大多数情况下使用,您将使用普通的字符串文字。它们可以用作函数调用或复合表达式的一部分。

        my $inner_str = 'middle text';
        
        my $full_str = <<FIRST_BLOCK . "$inner_str\n" . <<SECOND_BLOCK;
        This text is at the start of the string.
        And so is this.
        FIRST_BLOCK
        This text ends the first assignment to the string.
        SECOND_BLOCK
        

        Perl 用来解析heredoc 的规则允许一些非常奇怪的行为,当找到heredoc 时,当前行将继续被解析直到该行结束。然后 perl 将停止解析当前表达式并开始读取heredoc,直到找到结束标记。一旦找到在该行开始的所有 heredocs 的结束标记,它将继续解析,就好像表达式中没有中断一样。

        $full_str .= <<THIRD_BLOCK . "$inner_str
        This text is "appended" to the string.
        THIRD_BLOCK
        " . <<LAST_BLOCK;
        This text ends the string.
        LAST_BLOCK
        
        print $full_str;
        

        请注意,字符串在heredoc THIRD_BLOCK 的主体之前开始,在heredoc THIRD_BLOCK 之后结束,但不包括其内容。

        虽然您可以非常灵活地使用heredoc 语法,但我建议您每个表达式只使用一个heredoc,但请保持表达式简单。如果您在一个表达式中需要多个 heredocs 或在复杂表达式中需要一个,则先将 heredoc 分配给一个变量,然后在表达式中使用该变量。

        【讨论】:

        • 15 多年后,我仍在学习有关 perl 语法“最简单”位的新知识。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 2021-12-20
        • 2011-05-31
        相关资源
        最近更新 更多