Я получаю дополнительный 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 как в основном, так и в перенаправленном выходе.