Я получаю дополнительный CR, используя TT (Perl Template Toolkit)

Я использую Perl v5.10 (на Windows 7) + TT v2.22. Когда я использую TT, для каждой строки исходного кода я получаю в произведенном html дополнительный CR:

Исходный текст (формат Windows):

"Some_html" CR LF  

Вывод текста:

"Some_html" CR  
CR LF

Однако, когда я конвертирую свой исходный файл в формат Unix, а затем запускаю TT, я получаю:
Исходный текст (формат Unix):

"Some_html" LF   

Вывод текста:

"Some_html" CR LF

(Я использую notepad++ для отображения символов CR & LF; также для изменения форматов unix <-> windows в исходном шаблоне).

Когда я решаю проблему, я получаю (несколько) сообщений о дополнительных ^M на окнах, но я не мог найти объяснения, как для первопричины, так и для истинного решения (просто какой-то обходной путь, как избавиться от лишнего ^M).

Хотя это не настоящая проблема, я нахожу это довольно "нечистым".
Есть ли какая-то конфигурация, которую я должен включить (я просмотрел http://www.template-toolkit.org/docs/manual/Config.html но ничего не смог найти)?
Какое-то другое решение? (кроме пост-исправления выходного файла).
Спасибо

3 ответа

Решение

http://template-toolkit.org/ читает исходные файлы для шаблонов в двоичном режиме, но пишет в текстовом режиме. Данные из шаблона (который содержит CR LF) переводятся во время вывода в текстовом режиме, поэтому LF становится CR LF.

Самым простым решением этой проблемы является запись файлов в двоичном режиме (обратите внимание на raw модификатор к open вызов):

my $tt = Template->new;
my $output_file = 'some_file.txt';
open my $out_fh, '>:raw', $output_file    or die "$output_file: $!\n";
$tt->process('template', \%data, $out_fh) or die $tt->error();

Удачного дня, я нашел очень простое решение по этому вопросу:

my $tt = Template->new({
        ...,
        PRE_CHOMP  => 1,
        POST_CHOMP => 1,
        ...
});

Этот конфиг проинструктирует механизм шаблонов удалить все до и после CR LF текста шаблона.

Решение bvr, к сожалению, не работает для вывода, созданного с использованием [% FILTER redirect(...) %], В Windows 10 шаблон

[% FILTER redirect("bar.txt") %]
This text is for bar.txt.
[% END %]
This text is for foo.txt.

(с окончанием строки CR-LF в стиле DOS), расширенный

#! /bin/perl
use strict;
use warnings;

use Template;

my $tt = Template->new({
                        OUTPUT_PATH => '.',
                        RELATIVE => 1,
                       }) || die "$Template::ERROR\n";

my $srcfile = 'foo.txt.tt';
my $tgtfile = 'foo.txt';

open my $ofh, '>:raw', $tgtfile or die;

$tt->process($srcfile, {}, $ofh, { binmode => ':raw' })
    || die $tt->error . "\n";

создает выходной файл foo.txt с ожидаемыми окончаниями строк CR-LF, но создает bar.txt с неправильными окончаниями строк CR-CR-LF:

> od -c bar.txt
0000000  \r  \r  \n   T   h   i   s       t   e   x   t       i   s
0000020   f   o   r       b   a   r   .   t   x   t   .  \r  \r  \n
0000037

Я сообщил об этой проблеме автору ТТ по адресу https://github.com/abw/Template2/issues/63.

Я нашел простое решение: в выходной файл Template::_ (в Template.pm) измените

my $bm = $options->{ binmode };

в

my $bm = $options->{ binmode } // $BINMODE;

Тогда в вашем основном наборе Perl-скриптов

$Template::BINMODE = ':raw';

Затем вы можете обработать шаблон, используя

$tt->process($srcfile, {}, $tgtfile) || die $tt->error . "\n";

и получить окончания строки CR-LF как в основном, так и в перенаправленном выходе.

Другие вопросы по тегам