2012-02-03 55 views
5

我使用perl v5.10(在Windows 7)+ TT v2.22。當我用TT,爲每個源行,我得到的產生HTML額外CR我使用TT獲得額外的CR(perl模板工具包)

源文本(Windows格式):

"Some_html" CR LF 

輸出文本:

"Some_html" CR 
CR LF 

然而,當我將源文件轉換爲unix格式,然後運行TT時,得到:
源文本(unix格式):

"Some_html" LF 

輸出文本:

"Some_html" CR LF 

(I使用記事本++來顯示CR & LF字符;也可以在源模板中更改unix < - > Windows格式)。

當我谷歌的問題,我得到一些(少數)關於額外^M在Windows上的帖子,但我找不到解釋至於根本原因既不是一個真正的解決方案(只是一些解決方法如何擺脫額外的^M )。

雖然不是一個真正的問題,但我覺得它很「不潔」。
是否有一些配置,我應該打開(我回顧了www.template-toolkit.org/docs/manual/Config.html,但找不到任何東西)?
其他一些解決方案? (除了修復輸出文件之外)。
謝謝

回答

10

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

太棒了!它效果很好。 謝謝@bvr。 – gerard 2012-02-04 14:04:27

+0

@gerard - 很高興我能幫到你。 – bvr 2012-02-04 18:46:45

+0

非常感謝! – 2017-05-25 02:58:53

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行結束.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 

我報道這個問題的TT筆者在https://github.com/abw/Template2/issues/63

我發現了一個簡單的解決方法:在子模板:: _輸出(在模板中。PM),改變

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

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

然後在你的主perl腳本設置

$Template::BINMODE = ':raw'; 

然後你就可以使用

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

處理模板,並獲得CR -LF線的結局主要有兩個nd重定向輸出。

0

有一個好的一天, 我發現這是一個非常簡單的解決方案:

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

這個配置將指示模板引擎刪除模板的所有文字前,後的CR LF。

相關問題