Я получаю дополнительный CR, используя TT (Perl Template Toolkit) - PullRequest
5 голосов
/ 03 февраля 2012

Я использую 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 в Windows, но не могу найти объяснения относительно первопричины ни истинного решения (просто какой-то обходной путь, как избавиться от лишних). ^M). * * тысяча двадцать-одна

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

Ответы [ 3 ]

11 голосов
/ 03 февраля 2012

Template Toolkit читает исходные файлы для шаблонов в двоичном режиме, но пишет в текстовом режиме.Данные из шаблона (который содержит 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();
0 голосов
/ 08 января 2018

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

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

Этот конфиг будет инструктировать шаблонизатор удалять все предстартовые и последующие LF текста шаблона.

0 голосов
/ 26 мая 2017
Решение

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.

Я нашел простое обходное решение: в sub Template :: _ output (в 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 как на основном, так и на перенаправленном выходе.

...