perl यह कार्यक्रम वैध क्यों है? मैं एक वाक्यविन्यास त्रुटि बनाने की कोशिश कर रहा था




(4)

मैं विंडोज 7 पर ActiveState के 32 बिट ActivePerl 5.14.2 चला रहा हूं। मैं सिंटैक्स त्रुटियों के साथ प्रोग्रामों की जांच करने के लिए गिट प्री-प्रतिबद्ध हुक के साथ गड़बड़ करना चाहता था। (किसी भी तरह से मैं बस इतना बुरा काम करने में कामयाब रहा।) तो एक परीक्षण कार्यक्रम के रूप में मैंने यादृच्छिक रूप से यह देखा:

use strict;
use warnings;

Syntax error!

exit 0;

हालांकि, यह किसी भी चेतावनी के साथ संकलित और निष्पादित करता है, और त्रुटि से बाहर निकलने पर त्रुटि शून्य होती है। यह वैध वाक्यविन्यास कैसा है?


पर्ल 6 का प्रयास करें, ऐसा लगता है कि आपकी अपेक्षाओं को और अधिक आसानी से पूरा करना है:

===SORRY!=== Error while compiling synerror.p6
Negation metaoperator not followed by valid infix
at synerror.p6:1
------> Syntax error!⏏<EOL>
    expecting any of:
        infix
        infix stopper

पर्ल में "अप्रत्यक्ष विधि नोटेशन" नामक एक वाक्यविन्यास है। यह अनुमति देता है

Foo->new($bar)

के रूप में लिखा जाना है

new Foo $bar

तो इसका मतलब

Syntax error ! exit 0;

के समान है

error->Syntax(! exit 0);

या

error->Syntax(!exit(0));

न केवल यह वैध वाक्यविन्यास है, इसके परिणामस्वरूप रन-टाइम त्रुटि नहीं होती है क्योंकि निष्पादित पहली चीज़ exit(0)


आपको कोई त्रुटि नहीं मिलने का कारण यह है कि पहला निष्पादित कोड है

exit(0);

क्योंकि आपके पास पहली पंक्ति पर अर्धविराम नहीं था:

Syntax error!

संकलक अनुमान लगाएगा (गलत तरीके से) कि यह एक ऑपरेटर के साथ एक subroutine कॉल है ! इसमें फेंक दिया गया। यह इस सबराउटिन के तर्कों को निष्पादित करेगा, जो exit(0) लिए होता है exit(0) , जिस बिंदु पर प्रोग्राम निकलता है और त्रुटि से 0 तक सेट करता है। कुछ और निष्पादित नहीं किया जाता है, इसलिए कोई रनटाइम त्रुटियों की सूचना नहीं दी जाती है।

आप देखेंगे कि अगर आप exit(0) कुछ print "Hello world!" जैसे print "Hello world!" आपको एक त्रुटि मिलती है:

Can't locate object method "Syntax" via package "error" ...

और आपका त्रुटि स्तर सेट किया जाएगा:

> echo %errorlevel%
255

जैसा कि ऊपर बताया गया है अप्रत्यक्ष विधि कॉलिंग नोटेशन के कारण होता है। आप इस पर चेतावनी दे सकते हैं:

use strict;
use warnings;
no indirect;

Syntax error!

exit 0;

पैदा करता है:

Indirect call of method "Syntax" on object "error" at - line 5.

इसके लिए अप्रत्यक्ष सीपीएएन मॉड्यूल की आवश्यकता है।

आप no indirect "fatal"; का भी उपयोग no indirect "fatal"; कर सकते no indirect "fatal"; कार्यक्रम को मरने के कारण (यह वही है जो मैं करता हूं)





perl