在Perl中,可以使用普通引号或here-doc语句编写多行字符串文字,但由于代码缩进被计为字符串本身的内容,这要么破坏周围代码的格式,要么需要我们另外取消字符串使用前。此时,我使用以下子例程来取消字符串文字:
sub unindent {
local $_ = shift;
$_ =~ s/^\s*$//mg;
$_ =~ s/^(\s*>>>\s)//mg;
return $_;
}
print unindent "
>>> #pragma once
>>> #include <...>
>>> ";
但是不要重新发明轮子,我想问一下Perl或CPAN内置的内容是否已经存在?
答案 0 :(得分:2)
经过一些谷歌搜索后,我发现了一些具有相似功能的软件包并部分解决了问题:
Mojo::Util
Filter::Undent
Filter::Indent::HereDoc
Heredoc::Unindent
(由于某种原因不在CPAN上)第一个选项需要安装许多依赖项(对于简单的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
。
奇怪的是,核心语言中并没有这方面的东西。