2012-02-03 6 views
5

私はperl v5.10(Windows 7)+ TT v2.22を使用します。私はTTを使用する場合、各ソース行のために、私は余分なCR HTML生成に取得:私はTT(perlテンプレートツールキット)を使用して余分なCRを取得します

ソース・テキスト(Windows形式):

"Some_html" CR LF 

出力テキスト:

"Some_html" CR 
CR LF 

しかし、ソースファイルをUnix形式に変換してTTを実行すると、次のようになります。
ソーステキスト(Unix形式):

"Some_html" LF 

出力テキスト:

"Some_html" CR LF 

(私はCR & LF文字を表示する++メモ帳を使用します。また、Unix < - >ソーステンプレートのWindows形式を変更する)。

私は問題をグーグルとき、私は窓の上の余分な^Mに関するいくつかの(数)のポストを得るが、私はどちらも真の解(余分^Mを取り除くためにどのようにちょうどいくつかの問題を回避する根本的な原因のためとして説明を見つけることができませんでした)。

実際の問題ではありませんが、私はそれはかなり「汚れている」ことがわかります。
オンにする必要がある設定がありますか(私はwww.template-toolkit.org/docs/manual/Config.htmlを見直しましたが、何も見つかりませんでした)?
その他の解決方法(出力ファイルを後で固定する以外)。
ありがとう

答えて

10

Template Toolkitバイナリモードのテンプレート用のソースファイルを読み込みますが、テキストモードで書き込みます。テンプレート(CR LFを含む)のデータはテキストモードで出力中に変換されるので、LFはCR LFになります。

問題のための最も簡単な解決策は、(openコールへraw修飾子に注意してください)バイナリモードでファイルを作成することです:

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

素晴らしい!それは素晴らしい作品です。感謝@bvr。 – gerard

+0

@gerard - うれしく思っています。 – bvr

+0

ありがとうございます! –

0

BVRのソリューションは、残念ながら[% FILTER redirect(...) %]を使用して生成される出力のために動作しません。 Windowsの10、(DOSスタイルのCR-LFの改行コード付き)テンプレート

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

#! /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の行末を持つ.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::BINMODE = ':raw'; 

を設定する次に、あなたが

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

を使用してテンプレートを処理し、CRを得ることができ、あなたの主なperlスクリプトで次に

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

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

を変更-LFラインはメインAリダイレクトされた出力。この設定は、テンプレートテキストのすべての事前および事後CR LFを削除するにはテンプレートエンジンに指示します

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

0

は良い一日を、 私はこの上で、非常に簡単な解決策を見つけました。