我使用TT(perl模板工具包)获得额外的CR

时间:2012-02-03 03:37:44

标签: perl template-toolkit

我使用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

(我使用notepad ++来显示CR& LF字符;也可以在源模板中更改unix< - > windows格式)。

当我谷歌问题时,我在Windows上收到一些(少数)关于额外^M的帖子,但我找不到解释因为根本原因既不是真正的解决方案(只是一些解决方法如何摆脱额外^M)。

虽然不是真正的问题,但我发现它非常“不干净” 是否有一些我应该打开的配置(我查看过www.template-toolkit.org/docs/manual/Config.html但找不到任何内容)? 其他解决方案? (除了修复输出文件之外)。
感谢

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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 :: _输出(在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行结尾。

答案 2 :(得分:0)

祝你有个美好的一天, 我找到了一个非常简单的解决方案:

CREATE TABLE `tbl_order` (
  `order_id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `cus_fullname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `total_price` double DEFAULT NULL,
  `active` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `tbl_payment` (
  `pay_id` int(50) NOT NULL,
  `pro_id` int(15) NOT NULL,
  `pay_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_adress` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_cardname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `pay_cvc` int(3) NOT NULL,
  `pay_number` text COLLATE utf32_unicode_ci NOT NULL,
  `pay_mm` int(2) NOT NULL,
  `pay_yyyy` int(4) NOT NULL,
  `pay_totals` varchar(255) COLLATE utf32_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci;

此配置将指示模板引擎删除模板文本​​的所有前后CR LF。