5

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

(CR & LF 文字を表示するために notepad++ を使用します。また、ソース テンプレートで unix <-> Windows 形式を変更するためにも使用します)。

問題をグーグルで^M検索すると、Windowsのエクストラに関するいくつかの(少数の)投稿が表示されますが、根本的な原因や真の解決策(エクストラを取り除くためのいくつかの回避策^M)についての説明が見つかりませんでした。

本当の問題ではありませんが、かなり「汚れている」と思います。
オンにする必要のある構成はありますか ( www.template-toolkit.org/docs/manual/Config.htmlを確認しましたが、何も見つかりませんでした)。
他の解決策はありますか?(出力ファイルの後置修正以外)。
ありがとう

4

3 に答える 3

11

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();
于 2012-02-03T09:25:16.700 に答える
0

残念ながら、bvr のソリューションは、 を使用して生成された出力では機能しません[% FILTER redirect(...) %]。Windows 10 では、テンプレート

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

(DOS スタイルの CR-LF 行末で) 展開

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

予想される CR-LF 行末で出力ファイル foo.txt を作成しますが、不適切な CR-CR-LF 行末で bar.txt を作成します。

> 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で TT の作成者に報告しました。

簡単な回避策を見つけました: サブ 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 行末を取得します。

于 2017-05-26T10:34:50.257 に答える