Решение
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 как на основном, так и на перенаправленном выходе.