为什么Filter :: Indent :: HereDoc抱怨HereDoc中间的空白行

时间:2015-06-22 06:44:09

标签: perl heredoc

我正在尝试Filter::Indent::HereDoc,它允许我们缩进HereDocument。这非常有用,能够使用代码逻辑流动的HereDoc。

从上面的链接

  

当使用'here document'时,文档文本和终止   字符串必须与左边距齐平,即使其余部分也是如此   代码块缩进。

     

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

1 个答案:

答案 0 :(得分:1)

documentation说:

  

如果没有终结符字符串(所以这里的文档停止在   第一个空行),然后就会删除足够的空格   文档的最左边的字符将与左边齐平   保证金,例如

print <<;
     Hello,
    World!

# This will print:
 Hello,
World!

这是您在问题中引用的段落的正下方。 它在空行处停止的事实是一项功能