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




(4)

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

use strict;
use warnings;

Syntax error!

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 -MO=Deparse -w yuck
BEGIN { $^W = 1; }
use warnings;
use strict 'refs';
'error'->Syntax(!exit(0));
yuck syntax OK

ऐसा लगता है कि पार्सर सोचता है कि आप error -object पर विधि Syntax को बुला रहे हैं ... वास्तव में अजीब!


पर्ल 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






perl