Unindenting多行字符串文字

时间:2014-02-19 06:43:14

标签: perl cpan multiline code-formatting literals

在Perl中,可以使用普通引号或here-doc语句编写多行字符串文字,但由于代码缩进被计为字符串本身的内容,这要么破坏周围代码的格式,要么需要我们另外取消字符串使用前。此时,我使用以下子例程来取消字符串文字:

sub unindent {
    local $_ = shift;
    $_ =~ s/^\s*$//mg;
    $_ =~ s/^(\s*>>>\s)//mg;
    return $_;
}

print unindent "
    >>> #pragma once
    >>> #include <...>
    >>> ";

但是不要重新发明轮子,我想问一下Perl或CPAN内置的内容是否已经存在?

3 个答案:

答案 0 :(得分:2)

经过一些谷歌搜索后,我发现了一些具有相似功能的软件包并部分解决了问题:

第一个选项需要安装许多依赖项(对于简单的unindent函数),其余三个仅适用于here-docs。这些软件包似乎都不支持额外的标记(问题中为>>>),我认为这些标记比普通缩进更安全(由于标签空间混合问题)。

答案 1 :(得分:1)

这可能不是一个答案而不是评论,但由于评论中没有契约,我认为使用答案会更好地理解我的观点。 我估计你想找一种写

之类的东西的方法
my $str= "Stuff One
          Stuff Two
          Stuff Three";

因为它更具可读性,但实际字符串应该变为:

my $str= "Stuff OneStuff TwoStuff Three";

my $str=
"Stuff One
Stuff Two
Stuff Three";

正确?我不知道一个模块来清理字符串,我相信它可能不是很简单,因为使用了标签或空格,并且在最后一部分之后是否应该有换行符或换行符?但是你可以写:

my $str= "Stuff One".
         "Stuff Two".
         "Stuff Three";

my $str= "Stuff One\n".
         "Stuff Two\n".
         "Stuff Three";

并保持对字符串内容和内容的完全控制,而不会弄乱代码缩进或任何不需要的依赖项。

答案 2 :(得分:1)

You appear to want Syntax::Feature::Qi。这就像Python的textwrap.dedent

奇怪的是,核心语言中并没有这方面的东西。