2011-11-07 8 views
5

मैं perl -cw ... एक संकलन चेतावनी उत्सर्जित होने पर एक गैर-शून्य निकास स्थिति वापस करने के लिए चाहता हूं।बाहर निकलने की स्थिति सेट करें यदि perl -cw चेतावनी उत्सर्जित करता है

उदा।

use warnings; 
asd; 

फिर perl -cw a.pm रिपोर्ट: लगता है a.pm फ़ाइल है

Unquoted string "asd" may clash ... 
Useless use of a constant in void context ... 
a.pm syntax OK 

और बाहर निकलने स्थिति 0 पर सेट किया जाता है मुझे लगता है कि संकलन चेतावनी पता लगाने में सक्षम उत्सर्जित कर रहे थे होना चाहते हैं - अधिमानतः हालांकि बाहर निकलने की स्थिति की सेटिंग।

उत्तर

7

एक BEGIN ब्लॉक में एक चेतावनी हैंडलर सेट (स्क्रिप्ट के शीर्ष के निकट है, इसलिए इस ब्लॉक कोड से पहले पार्स किया गया है कि संकलन समय ट्रिगर हो सकता है चेतावनी), और एक END में बाहर निकलें स्थिति tweak CHECK ब्लॉक।

use strict; 
use warnings; 
my $warnings; 
BEGIN { 
    $SIG{__WARN__} = sub { $warnings++; CORE::warn @_ } 
} 
$used::only::once = 42; 
CHECK { 
    if ($^C && $warnings > 0) { 
     exit $warnings; 
    } 
} 

$^C चर सच यदि और केवल यदि आप -c विकल्प के साथ perl लागू कर दिया है।

+0

वाक्यविन्यास जांच मोड में END ब्लॉक नहीं लगाया जा रहा है। आप इसे बहुत आसान देख सकते हैं: 'perl -c -e'END {प्रिंट "एंड ब्लॉक \ n"}' '। अगर ऐसा होता है - हम चेतावनी गिनने के लिए केवल एक कस्टम प्रगति का उपयोग कर सकते हैं और बाहर निकलने की स्थिति को ट्विक कर सकते हैं – yko

+0

@yko - क्षमा करें, मैंने पहले '-c' का उपयोग करने के बारे में हिस्सा गलत तरीके से पढ़ा था। अब तय – mob

+0

@mob: यह बहुत अच्छा है! – JRFerguson

5

जहाँ तक मुझे पता है, यह संभव नहीं है। आखिरकार, वे सलाहकार नोटिस केवल सख्ती से नहीं हैं (कोई इरादा नहीं है) त्रुटियां। उलटा, हालांकि, आप रनटाइम पर घातक त्रुटियों के लिए चेतावनियों को बढ़ावा दे सकते हैं यदि इससे आपके उद्देश्य को हल करने में मदद मिलती है।

$ perl -M'warnings FATAL=>q(all)' -cw a.pm ; echo $? 
Unquoted string "asd" may clash with future reserved word at a.pm line 2. 
255 
+0

क्या यह काम करता है? मैं चेतावनियों और बाहर निकलने की स्थिति के साथ पुन: पेश नहीं कर सकता> 0 – yko

+0

@yko: हाँ यह काम करता है। इसे ओपी की मूल लिपि के साथ आज़माएं। – JRFerguson

+0

हाँ यह काम करता है, क्षमा करें – yko

2

इस व्यवहार को प्राप्त करने के लिए आप पहली चेतावनी के बाद मरने के लिए $SIG{__WARN__} का उपयोग कर सकते हैं। बस इस तरह:

package warncounter; 

use strict; 
use warnings; 

my $warnings; 

BEGIN { 
    $SIG{__WARN__} = sub { 
     $warnings++; 
     CORE::warn(@_); 
     exit(255); 
    }; 
} 

1; 

और फिर आप के रूप में

perl -Mwarncounter -wc test.pl 

जाँच वाक्य रचना चला सकते हैं लेकिन फिर पर्ल सही पहली चेतावनी के बाद बाहर निकल जाएगा। मेरा पहला विचार चेतावनी की संख्या गिनना था और ईएनडी ब्लॉक में निकास की स्थिति निर्धारित करना था, लेकिन वाक्यविन्यास जांच मोड -c ईएनडी ब्लॉक नहीं लगाया जा रहा था।

संबंधित मुद्दे