2012-02-03 31 views
5

Tôi sử dụng perl v5.10 (trên windows 7) + TT v2.22. Khi tôi sử dụng TT, cho mỗi dòng mã nguồn, tôi nhận được trong html sản xuất thêm một CR:Tôi nhận được CR bổ sung bằng TT (bộ công cụ mẫu perl)

Nguồn văn bản (cửa sổ định dạng): văn bản

"Some_html" CR LF 

Output:

"Some_html" CR 
CR LF 

Tuy nhiên, khi tôi chuyển đổi tệp nguồn thành định dạng unix và sau đó tôi chạy TT, tôi nhận được:
Văn bản nguồn (định dạng unix):

"Some_html" LF 
văn bản

Output:

"Some_html" CR LF 

(tôi sử dụng notepad ++ để hiển thị các ký tự LF CR &; cũng để thay đổi unix < -> windows định dạng trong mẫu nguồn). Khi tôi google vấn đề, tôi nhận được một số (vài) bài viết về thêm ^M trên cửa sổ, nhưng tôi không thể tìm thấy lời giải thích vì nguyên nhân gốc không phải là một giải pháp thực sự (chỉ cần một số cách giải quyết làm thế nào để thoát khỏi thêm ^M).

Mặc dù không phải là một vấn đề thực sự, tôi thấy nó khá "ô uế".
Có một số cấu hình mà tôi nên bật (Tôi đã xem lại www.template-toolkit.org/docs/manual/Config.html nhưng không thể tìm thấy bất kỳ thứ gì)?
Một số giải pháp khác? (không phải là sau khi sửa chữa tệp đầu ra).
Cảm ơn

Trả lời

10

Template Toolkit đọc tệp nguồn cho mẫu ở chế độ nhị phân nhưng viết ở chế độ văn bản. Dữ liệu từ mẫu (có chứa CR LF) được dịch trong khi xuất ở chế độ văn bản, do đó LF trở thành CR LF.

Giải pháp dễ nhất cho vấn đề là để ghi tập tin trong chế độ nhị phân (chú ý raw modifier để open gọi): giải pháp

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

Tuyệt vời! Nó hoạt động tuyệt vời. cảm ơn @bvr. – gerard

+0

@gerard - vui vì tôi có thể giúp. – bvr

+0

Cảm ơn các công trình tuyệt vời! –

0

BVR của may không hoạt động cho đầu ra được tạo ra sử dụng [% FILTER redirect(...) %]. Trên Windows 10, mẫu

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

(với hệ điều hành DOS kiểu kết thúc dòng CR-LF) mở rộng thông qua

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

tạo foo.txt tập tin đầu ra với kết thúc dòng CR-LF mong đợi, nhưng tạo ra thanh .txt với kết thúc dòng CR-CR-LF không hợp lệ:

> 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 

Tôi đã báo cáo vấn đề này với tác giả TT tại https://github.com/abw/Template2/issues/63.

Tôi đã tìm thấy giải pháp giải pháp đơn giản: Trong mẫu phụ :: _ đầu ra (trong Mẫu.pm), thay đổi

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

để

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

Sau đó, trong kịch bản perl chính bạn thiết lập

$Template::BINMODE = ':raw'; 

Sau đó, bạn có thể xử lý các mẫu sử dụng

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

và nhận CR -LF kết thúc dòng trong cả hai nd chuyển hướng đầu ra.

0

Chúc một ngày tốt, Tôi tìm thấy một giải pháp rất đơn giản về vấn đề này:

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

cấu hình này sẽ hướng dẫn các mẫu động cơ để loại bỏ tất cả trước và sau LF CR của mẫu văn bản.

Các vấn đề liên quan