2012-02-03 65 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。

相关问题