【问题标题】:Does Perl have the equivalent of Python's multiline strings?Perl 有相当于 Python 的多行字符串吗?
【发布时间】:2010-05-20 18:36:34
【问题描述】:

在 Python 中,您可以使用 docstring 来创建这样的多行字符串

foo = """line1
line2
line3"""

Perl 中有没有等价的东西?

【问题讨论】:

  • 请注意,您所做的不是文档字符串。它只是多行字符串语法。文档字符串通常是类或函数开头的字符串,用于解释类/函数,可以通过name.__doc__ 访问。这些也用于自动生成帮助页面。
  • 确实,Perl 中与实际 Python 文档字符串最接近的等价物是 Perl 的“Plain Old Documentation”(perldoc.perl.org/perlpod.html),它同时更具表现力和复杂度。不过,我不知道它是否提供了以编程方式从它所使用的脚本中获取的相同功能。
  • @cikkle,POD 在运行时不可用。
  • daotad:也许不容易,但如果认为有用的话,想出一些使用*PackageName::Data 和 POD 解析器的东西应该是很有可能的。但是您肯定正确地指出,编译器不会将 POD 包含在任何普通数据结构中。

标签: perl multiline


【解决方案1】:

普通引号:

# Non-interpolative
my $f = 'line1
line2
line3
';

# Interpolative
my $g = "line1
line2
line3
";

Here-docs 允许您将任何标记定义为引用文本块的结尾:

# Non-interpolative
my $h = <<'END_TXT';
line1
line2
line3
END_TXT

# Interpolative
my $h = <<"END_TXT";
line1
line2
line3
END_TXT

正则表达式风格的引号运算符让您可以使用几乎任何字符作为分隔符——就像正则表达式允许您更改分隔符一样。

# Non-interpolative
my $i = q/line1
line2
line3
/;

# Interpolative
my $i = qq{line1
line2
line3
};

更新:更正了 here-doc 标记。

【讨论】:

    【解决方案2】:

    Perl 没有重要的语法垂直空格,所以你可以这样做

    $foo = "line1
    line2
    line3
    ";
    

    相当于

    $foo = "line1\nline2\nline3\n";
    

    【讨论】:

    • 虽然这是正确的,但您真的想看看这里的文档。查看其他答案。
    • @tsee:为什么? here-doc 对 OP 的简单字符串问题有什么好处? Here-docs 的主要缺点是会影响代码的缩进(它们必须左对齐)。
    • 普通的引用也是如此,除非你想在末尾有额外的空格。 here-docs 更可取,因为 ' 和 " 是用于扫描很长字符串结尾的糟糕标识符。
    • @ire_and_curses Indented here-docs &lt;&lt;~EOF 解决了这个问题(自 Perl5 v26 起可用)
    【解决方案3】:

    是的,这里的文档。

    $heredoc = <<END;
    Some multiline
    text and stuff
    END
    

    【讨论】:

      【解决方案4】:

      是的,您有 2 个选项:

      1.heredocs 请注意,heredocs 中的每个数据都是插值的:

      我的 $data =

      你的数据

      结束

      2.qq() 例如:

      打印qq( HTML

      $你的文字

      身体

      HTML );

      【讨论】:

      • 欢迎来到 Stack Overflow。如果你要为一个已经有几个好的答案的问题提供答案,尤其是一个答案已经被接受的问题,你应该考虑你的答案是否真的添加了任何新信息。在这种情况下,你的没有。另外,在写答案的时候,请注意编辑框下方的预览;它会向您表明您的答案并不能很好地说明多行字符串。请参阅编辑框右侧的格式说明。
      【解决方案5】:

      快速示例

      #!/usr/bin/perl
      use strict;
      use warnings;
      
      my $name = 'Foo';
      
      my $message = <<'END_MESSAGE';
      Dear $name,
      
      this is a message I plan to send to you.
      
      regards
        the Perl Maven
      END_MESSAGE
      
      print $message;
      

      ...结果:

      Dear $name,
      
      this is a message I plan to send to you.
      
      regards
        the Perl Maven
      

      参考:http://perlmaven.com/here-documents

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 2011-04-01
        • 2018-11-16
        • 1970-01-01
        • 2011-12-12
        相关资源
        最近更新 更多