我正在尝试Filter::Indent::HereDoc,它允许对HereDocument进行缩进。这非常有用,可以让HereDoc和代码逻辑一起流动。
从上述链接
当使用"此处文档"时,文档文本和终止字符串必须与左边距齐平,即使代码块缩进。
Filter::Indent::HereDoc删除了此限制,并在DWIM的一种方式——如果终止符字符串缩进,那么缩进级别将适用于整个文档。
该模块可以使用sudo cpanm Filter::Indent::HereDoc
进行安装
然而,我发现如果HereDoc中有空行,那么它会给出错误
Can't find string terminator "EOT" anywhere before EOF at....
删除空行时不会发生这种情况。这是MWE
#!/usr/bin/perl
use strict;
use warnings;
use Filter::Indent::HereDoc;
my $str = <<'EOT';
some text
some text
EOT
print $str;
上面的运行没有问题,即使在EOT
之前存在空间(如果不使用Filter::Indent::HereDoc
,它会失败)
>perl t4.pl
some text
some text
>
现在我只是在中间插入一行空白,就像这个
#!/usr/bin/perl
use strict;
use warnings;
use Filter::Indent::HereDoc;
my $str = <<'EOT';
some text
some text
EOT
print $str;
现在
>perl t4.pl
Can't find string terminator "EOT" anywhere before EOF at t4.pl line 6.
>
如果EOT
之前的空间现在被移除,那么它可以工作:
#!/usr/bin/perl
use strict;
use warnings;
use Filter::Indent::HereDoc;
my $str = <<'EOT';
some text
some text
EOT
print $str;
现在
>perl t4.pl
some text
some text
>
但使用这个模块的整个想法是允许对HereDoc进行缩进。
知道发生了什么事吗?
信息:
>perl --version
This is perl 5, version 18, subversion 2 (v5.18.2) built
for i686-linux-gnu-thread-multi-64int
文档中写道:
如果没有终止符字符串(因此here文档在第一个空行),然后将去掉足够的空白,以便文档最左边的字符将与左边对齐裕度,例如
print <<; Hello, World! # This will print: Hello, World!
这是你在问题中引用的那一段正下方的一段它在空行处停止是一个特性。