जब मैं पर्ल के साथ अपनी पायथन स्क्रिप्ट निष्पादित करता हूं तो मुझे कोई सिंटैक्स त्रुटियां क्यों नहीं मिलती हैं?


85

मैंने अभी कुछ परीक्षण अजगर कोड में लिखा है test.py, और मैं इसे इस प्रकार शुरू कर रहा हूं:

perl test.py

थोड़ी देर बाद मुझे अपनी गलती का एहसास हुआ। मैं कहता हूं "थोड़ी देर बाद", क्योंकि पायथन कोड वास्तव में सही ढंग से निष्पादित होता है, जैसे कि पायथन दुभाषिया में!

मेरा पर्ल मेरे पायथन की व्याख्या क्यों कर रहा है? test.pyइस तरह दिखता है:

#!/usr/bin/python

...Python code here...

दिलचस्प बात यह है कि अगर मैं विपरीत (यानी कॉल python something.pl) करता हूं तो मुझे सिंटैक्स त्रुटियों का एक अच्छा सौदा मिलता है।


6
मैं अनुमान लगा रहा हूं कि यह #!फ़ाइल की शुरुआत में है। वास्तव में अगर मैं शी-बैंग हटाता हूं, तो मुझे अपेक्षित व्यवहार मिल रहा है। वैसे भी सुरक्षा के नजरिए से बुरा विचार नहीं है?
Dacav

7
नहीं, दुभाषिया निर्दिष्ट करने के लिए शेबंग पथ का बिंदु। यदि आपको चलाने के लिए कोड पर भरोसा नहीं है, तो आपको इसे पहले स्थान पर नहीं चलाना चाहिए।
Sobrique

1
नहीं वास्तव में नहीं। आपकी स्क्रिप्ट एक टेक्स्ट फ़ाइल है। न आधिक न कम। यह एक दुभाषिया के बिना नहीं चलेगा।
Sobrique

4
"मेरा पर्ल मेरे अजगर की व्याख्या क्यों कर रहा है?" "एक समस्या है जिसे अब पुन: प्रस्तुत नहीं किया जा सकता है या एक सरल टाइपोग्राफ़िकल त्रुटि है।" फिर से खोलने की वोटिंग की गई। क्यू और ए शो पर अपवोट्स यह लोकप्रिय रुचि का सवाल है।
इकेगामी

1
@ikegami लोकप्रियता के बावजूद, यह स्पष्ट रूप से "एक सरल टाइपोग्राफिक त्रुटि नहीं है ... भविष्य के पाठकों की मदद करने के लिए असंभावित तरीके से हल किया गया है।" फिर से खोलने की वोटिंग की गई।
ThisSuitIsBlackNot

जवाबों:


114

से perlrun ,

यदि #!रेखा में "पर्ल" शब्द नहीं है और न ही शब्द "इंदिर" है, जिसका नाम #!पर्ल इंटरप्रेटर के बजाय निष्पादित किया गया है। यह थोड़ा विचित्र है, लेकिन यह उन मशीनों पर लोगों की मदद करता है जो ऐसा नहीं करते हैं #!, क्योंकि वे एक कार्यक्रम बता सकते हैं कि उनका SHELL / usr / bin / perl है , और पर्ल तब उनके लिए सही दुभाषिया के लिए कार्यक्रम भेजेंगे।

उदाहरण के लिए,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
वाह। अपनी अस्पष्ट विशेषताओं के बारे में बात करें। मैं 20 से अधिक वर्षों से पर्ल का उपयोग कर रहा हूं, और मुझे नहीं पता था कि ऐसा किया था।
cjm

4
मैंने डॉस, वीएमएस और सोलारिस पर पर्ल वी 4 का उपयोग करना शुरू कर दिया। यह ओएस एग्नोस्टिक / ब्रिजिंग फीचर्स है जिसने क्रॉस प्लेटफॉर्म लाइफ को इतना आसान बना दिया है।
tjd

1
@MarcvanLeeuwen जब आप लिनक्स, OSX, VAX / VMS, विंडोज, सोलारिस, OS / 2 के लिए प्रोग्राम लिखते हैं, और स्क्रिप्ट-भाषा प्रोग्राम को पोर्ट करने का सबसे अधिक कष्टप्रद हिस्सा यह हो रहा है, तो इनमें से कई प्रणालियों के रूप में, हालांकि आमतौर पर "एक कमांड टाइप करें, क्या इसे पाया और निष्पादित किया गया है" सुविधा को आम तौर पर, लगभग सब कुछ अलग तरीके से करते हैं। यह पर्ल सुविधा कार्यक्षमता में पर्ल को एक आसान गैप-ब्रिज बनाती है - आप सिर्फ यूनिक्स-शैली का शेबंग लिख सकते हैं और यदि पर्ल कोड मौजूद है, तो पर्ल कोड हो या न हो, हमेशा काम करेगा - यह एक अधिक सार्वभौमिक की तरह है #! /usr/bin/env foo
zxq9

1
@immibis perl5- पोर्टर्स मेलिंग लिस्ट पर थ्रू शेबंग लाइन पार्सिंग मिस्ट्री : " indirएक प्रोग्राम था जिसे अप्रत्यक्ष रूप से अन्य कार्यक्रमों को अंजाम देने के लिए तैयार किया गया था। मेरा स्मरण है कि यह उन स्थितियों में विशेष रूप से उपयोगी माना जाता था जहां ओएस मूल रूप से प्रदान नहीं करता था। आप बहुत मदद करते हैं, और / या शायद उन स्थितियों में जहां ओएस कर्नेल आपको 32 वर्ण कमांड लाइनों तक सीमित करता है। "
ThisSuitIsBlackNot

2
यह प्रोग्रामिंग भाषाओं के किचन सिंक के रूप में पर्ल की प्रतिष्ठा को पुख्ता करता है। एक दिलचस्प अवलोकन के रूप में, मेरा मानना ​​है कि शेबंग का मूल कार्यान्वयन एक शेल विशेषता के रूप में था, यह केवल यूनिक्स कर्नेल में बाद में चला गया। पर्ल में कई शेल तंत्र शामिल हैं (जैसे कमांड आउटपुट को प्रतिस्थापित करने के लिए बैकटिक्स), यह सिर्फ एक और है।
बरमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.