2009-02-21 13 views
13

क्या Template::process के दौरान के माध्यम से पर उपयोग करने का प्रयास करने वाले सभी अपरिभाषित मानों के लिए पर्ल की Template डिस्प्ले चेतावनियां बनाने का कोई तरीका है?क्या पर्ल का टेम्पलेट टूलकिट अपरिभाषित मानों पर चेतावनी दे सकता है?

डिफ़ॉल्ट व्यवहार को अनदेखा करना और आगे बढ़ना है। यदि संभव हो तो अपरिभाषित मानों के मामले में, और STDERR को संदेश लॉग इन करने के लिए मैं केवल चेतावनी देना चाहता हूं।

उत्तर

9

हां। यदि आप DEBUG विकल्प को Template->new पर पास करते हैं, तो टीटी आपको अपरिभाषित मानों के बारे में चेतावनी देगा। http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Variables.pod

+0

देखा कि, लेकिन यह सुनिश्चित नहीं था कि यह अन्य सामानों का एक गुच्छा भी होगा। – cdleary

+0

इसके अलावा, क्या यह किसी विशेष फ़ाइल हैंडल पर जाने का कोई तरीका है? – cdleary

+1

डुनो, क्षमा करें :) मैं टेम्पलेट :: परिष्कृत का उपयोग करता हूं। – jrockway

16

आप के लिए देख रहे हैं:

DEBUG_UNDEF 

यह विकल्प खाका टूलकिट जब भी यह एक अपरिभाषित चर मूल्य का सामना करना पड़ता है एक 'undef' त्रुटि फेंक करने का कारण बनता

डॉक्स यहाँ देखें।

use Template::Constants qw(:debug); 

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

(http://search.cpan.org/dist/Template-Toolkit/lib/Template/Manual/Config.pod से।)

आप अपवाद के कुछ विशेष हैंडलिंग क्या करना चाहते हैं, तो आप to catch it or replace the __DIE__ signal handler की आवश्यकता होगी।


की यह एक साथ रखा है:

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

उत्पादन होता है:

  1. :

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

    मेरे दृष्टिकोण टेम्पलेट वर्ग के दो अलग-अलग विविधताएं का उपयोग किया गया $debug_tt जो है DEBUG_UNDEF ध्वज चालू हो गया और $output चर में इसके आउटपुट को छुपाता है।

  2. $tt जो एक वेनिला उदाहरण है और इसके आउटपुट को STDOUT पर डिफ़ॉल्ट रूप से प्रिंट करता है।

दोनों उदाहरणों में एक ही और एक ही चर हैश $vars में संग्रहीत $template में संग्रहित टेम्पलेट का उपयोग करें। eval में समय से बाहर निकलने से बचने के लिए लपेटा गया है और $debug_tt->error() सत्य होने पर चेतावनी उत्सर्जित की जाती है। $tt सामान्य रूप से निष्पादित किया जाता है। मुझे लगता है कि यह आपकी मुख्य आवश्यकताओं को पूरा करता है हालांकि यह संभवतः कुशल नहीं है। हमें इस विधि का उपयोग करके दो बार $template पार्स करने की आवश्यकता है।

कुछ विचार है कि मैं इस पर काम कर रहा था:

  1. यह अच्छा हो गया होता यदि Template::ToolkitCarp का इस्तेमाल किया था तो हम चेतावनी पर थोड़ा अधिक संदर्भ पाने सकता है।

  2. कोई शायद टेम्पलेट से एक वर्ग प्राप्त कर सकता है जो की बजाय त्रुटि पर warn होगा। मुझे ऐसा करने की तरह महसूस नहीं हुआ।

  3. आपके टेम्पलेट्स कैसे सेट अप किए जाते हैं, इस पर निर्भर करते हुए, एक समय में इसे एक पंक्ति में खिलाने का अर्थ हो सकता है ताकि जब आप एक अपरिभाषित मान पाएंगे तो आप पंक्ति संख्याओं को उत्सर्जित कर सकते हैं।

  4. टेम्पलेट्स को अपनी त्रुटियों के परीक्षण के लिए बदलने और अपरिभाषित मूल्यों के चेहरे में अधिक समझदार पाठ को उत्सर्जित करना संभव होना चाहिए।

+1

क्या सभी अपरिभाषित मानों पर * चेतावनी * रखने का कोई तरीका है लेकिन अभी भी टेम्पलेट को पूरा करने के लिए प्रस्तुत करना है? – cdleary

+0

बकवास, मुझे समय सीमा याद आई ... क्षमा करें जॉन, लेकिन मदद के लिए धन्यवाद! – cdleary