2009-02-21 14 views
13

Có cách nào để thực hiện cảnh báo hiển thị Template của Perl cho tất cả các giá trị không xác định mà tôi cố gắng sử dụng GET directive trên (qua [% %]) trong Template::process không?Bộ công cụ mẫu của Perl có thể cảnh báo về các giá trị không xác định?

Hành vi mặc định là bỏ qua và tiếp tục. Tôi muốn cảnh báo chỉ trong trường hợp giá trị không xác định, nếu có thể và để ghi nhật ký vào STDERR.

Trả lời

9

Có. Nếu bạn chuyển tùy chọn DEBUG tới Template->new, TT sẽ cảnh báo bạn về các giá trị không xác định.

Xem các tài liệu ở đây: http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod

+0

Thấy điều đó, nhưng không chắc liệu nó có thể phun ra nhiều thứ khác nữa không. – cdleary

+0

Ngoài ra, có cách nào để làm cho nó đi đến một xử lý tập tin cụ thể? – cdleary

+1

Dunno, xin lỗi :) Tôi sử dụng Mẫu :: Tinh chỉnh. – jrockway

16

Bạn đang tìm kiếm:

DEBUG_UNDEF 

Tùy chọn này khiến Toolkit Mẫu để ném ra một lỗi 'undef' bất cứ khi nào nó gặp một giá trị biến không xác định.

use Template::Constants qw(:debug); 

my $template = Template->new({ 
    DEBUG => DEBUG_UNDEF, 
}); 

(Từ http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod.)

Nếu bạn muốn làm một số xử lý đặc biệt của ngoại lệ, bạn sẽ cần to catch it or replace the __DIE__ signal handler.


Hãy đặt nó với nhau:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Template; 
use Template::Constants qw(:debug); 

my $debug_tt = Template->new({ 
    DEBUG => DEBUG_UNDEF, 
}); 

my $tt = Template->new(); 

my $vars = { 
    something => "42", 
}; 

my $template = <<EOF; 
First something undefined: [% nothing %]. 
And now something defined: [% something %]. 
EOF 

my $output = ''; 

eval {$debug_tt->process(\$template, $vars, \$output)}; 
warn $debug_tt->error() if $debug_tt->error(); 

$tt->process(\$template, $vars); 

Đầu ra là:

undef error - nothing is undefined 
First something undefined: . 
And now something defined: 42. 

Biện pháp của tôi là sử dụng hai trường hợp khác nhau của lớp mẫu:

  1. $debug_tt trong đó có cờ DEBUG_UNDEF được bật và ẩn đầu ra của nó trong biến số $output.

  2. $tt là ví dụ vani và in đầu ra thành STDOUT làm mặc định.

Cả hai trường hợp sử dụng cùng một mẫu lưu trữ trong $template và băm cùng một biến lưu trữ trong $vars. $debug_tt được gói trong một eval để tránh thoát sớm và cảnh báo được phát ra nếu $debug_tt->error() là đúng. $tt được thực hiện bình thường. Tôi nghĩ rằng điều này đáp ứng yêu cầu chính của bạn mặc dù nó có thể không hiệu quả. Chúng ta cần phân tích cú pháp $template hai lần bằng phương pháp này.

Vài suy nghĩ tôi đã làm việc về vấn đề này:

  1. Nó sẽ được tốt đẹp nếu Template::Toolkit đã sử dụng Carp để chúng tôi có thể nhận được bối cảnh nhiều hơn một chút trên cảnh báo.

  2. Có thể có thể lấy được một lớp từ Mẫu sẽ warn thay vì die do lỗi. Tôi không muốn làm điều đó.

  3. Tùy thuộc vào cách các mẫu của bạn được thiết lập, bạn có thể tạo mẫu theo từng dòng để bạn có thể phát ra số dòng khi tìm thấy giá trị không xác định.

  4. Có thể thay đổi các mẫu để kiểm tra lỗi của chính chúng và phát ra văn bản hợp lý hơn khi đối mặt với các giá trị không xác định.

+1

Có cách nào để có * cảnh báo * trên tất cả các giá trị không xác định nhưng vẫn hiển thị mẫu để hoàn thành? – cdleary

+0

Crap, tôi đã bỏ lỡ thời hạn ... xin lỗi Jon, nhưng cảm ơn vì sự giúp đỡ! – cdleary