Почему Filter::Indent::HereDoc жалуется на пустую строку в середине HereDoc

Я пытаюсь использовать 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....

Чего не происходит, когда я удаляю пустую строку. Вот МВЕ

#!/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

person Nasser    schedule 22.06.2015    source источник


Ответы (1)


В документации говорится:

Если нет строки-терминатора (поэтому здесь документ останавливается на первой пустой строке), то будет удалено достаточно пробелов, чтобы крайний левый символ документа был на одном уровне с левым полем, например.

print <<;
     Hello,
    World!

# This will print:
 Hello,
World!

Это абзац непосредственно под тем, который вы процитировали в вопросе. Тот факт, что он останавливается на пустых строках, является особенностью.

person simbabque    schedule 22.06.2015
comment
Я читал это, но я действительно не понял этого. И я до сих пор не понимаю всего этого. Какой тогда смысл использовать этот модуль, если в этом документе не может быть пустой строки?? то есть я спрашиваю, как можно использовать пустую строку и при этом использовать функцию отступа? Если не может быть пустой строки, то весь этот модуль не имеет смысла. Или, может быть, я все еще что-то упускаю. - person Nasser; 22.06.2015
comment
Я не знаю, для чего этот модуль. Удобство, наверное. Он был написан в 2003 году, и последний выпуск тоже 2003 года. Честно говоря, я не вижу в этом никакой пользы. Что вы могли бы сделать, так это починить его, но в любом случае есть только одна функция, так что это не имеет особого смысла. - person simbabque; 22.06.2015
comment
хорошо, спасибо. Если это так, как это должно работать, то это действительно бесполезно. Отсутствие пустой строки в этом документе не имеет смысла. - person Nasser; 22.06.2015