2015-06-22 48 views
1

我在尝试Filter::Indent::HereDoc,它允许缩进HereDocument。这非常有用,能够让代码逻辑流动的HereDoc。为什么Filter :: Indent :: HereDoc在HereDoc中间的空白行时发生抱怨

从上述链路

当“在这里文件”时,文档文本和终止 串必须与左边距齐平,即使 代码块的其余部分缩进。

Filter :: Indent :: HereDoc删除此限制,并采用更多的DWIM类型的方式 - 即如果终止符字符串缩进,则该缩进级别将应用于整个文档。

此模块可以使用sudo cpanm Filter::Indent::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 
> 

但是使用这个模块的整体思路是允许一个缩进定界符。

任何想法是怎么回事?

信息:

>perl --version 

This is perl 5, version 18, subversion 2 (v5.18.2) built 
for i686-linux-gnu-thread-multi-64int 

回答

1

documentation说:

如果没有终止字符串(所以这里的文档在 第一个空行停止),然后足够的空白将被清除掉这样 文档的最左边字符将与左边的 保持齐平,例如

print <<; 
    Hello, 
    World! 

# This will print: 
Hello, 
World! 

这是一款直接下面你在问题中所引用的一个。 它停在空行是一个功能

+0

我读过这个,但我真的不明白。我仍然不明白这一切。那么使用这个模块有什么意义呢,如果在这里文档中没有空白行?即我问,如何使用空白行,仍然使用缩进功能?如果一个人不能有空行,那么这个模块就没有意义了。或者可能是我仍然失去了一些东西。 – Nasser

+0

我不知道该模块的用途。方便,我想。它是在2003年编写的,[最新版本](https://metacpan.org/changes/distribution/Filter-Indent-HereDoc)也是2003年。说实话,我没有看到这方面的任何用处。你可以做的是修正它,但是无论如何只有一个功能,所以这没有任何意义。 – simbabque

+0

好的,谢谢。如果这是它应该如何工作,那么它真的没用。在这里没有空白行是没有意义的。 – Nasser