2011-03-18 9 views
6

मैं किसी ऐसे व्यक्ति की तलाश कर रहा हूं जो मुझे लगता है कि मुझे लगता है कि मुझे पर्ल स्क्रिप्ट की शेबांग लाइन पर -CSDA विकल्प के बारे में पता है।क्या अच्छा है -एससीडीए केवल शेबांग लाइन पर निर्दिष्ट है?

-CSDA के प्रलेखन के लिए perldoc perlrun देखें। संक्षेप में

  • एस: दोनों इनपुट और आउटपुट के लिए डिफ़ॉल्ट PerlIO परत धाराओं UTF-8 है
  • एक:: STDIN, STDOUT और STDERR UTF-8
  • डी में माना जाता है @ARGV तत्वों तार में एन्कोड करने की उम्मीद कर रहे हैं UTF-8
  • -CSDA के लिए कोई प्रभाव नहीं है, इसे कमांड लाइन पर perl -CSDA script.pl पर निर्दिष्ट किया जाना चाहिए।

  • 5.10, -CSDA कुटिया लाइन चुपचाप विफल हो जाएगा क्योंकि मानक धाराओं पहले से ही खोल दिया गया है | और @ARGV पहले से ही समय है जब तक कि -CSDA पहले से ही कमांड लाइन पर निर्दिष्ट किया गया था और साथ ही यह सामना करना पड़ा था की आबादी पर करने से पहले।

  • 5,10 के बाद, -CSDA जो केवल कुटिया लाइन पर प्रतीत होता है कि समस्या के कारण croak को perl कारण बनता है।

  • उस के साथ काम करता था -CSDA साथ एक स्क्रिप्ट perl रों पूर्व 5.10 -CSDA कुटिया लाइन से हटा दिया है क्योंकि यह कमांड लाइन पर उन विकल्पों (और विकल्पों के साथ लागू नहीं किया गया था, अगर पर पूरी तरह निर्दिष्ट होना चाहिए शेबांग लाइन, कुछ नहीं किया)।

मुझे कुछ ठोस प्रतिक्रियाएं मिलेंगी कि उपरोक्त मेरी धारणाएं गलत हैं।

उत्तर

3

सुनिश्चित नहीं हैं कि मैं कैसे आधिकारिक हूँ, लेकिन मुझे पता है कि यह कैसे काम करता है।

  • आपकी पहली धारणा लगभग सटीक है। एसडीए विकल्पों के प्रभाव के लिए, दुभाषिया शुरू होने पर उन्हें उपस्थित होना चाहिए। यह कमांड लाइन पर -CSDA के कारण हो सकता है, या यह PERL_UNICODE पर्यावरण चर के कारण हो सकता है, या संभवतः कुछ अन्य विधि जो मुझे अनजान है।
  • आपकी दूसरी धारणा कम से कम 5.8.8 के लिए सही है। ध्यान दें कि डी फ्लैग का अभी भी स्क्रिप्ट द्वारा खोले गए स्ट्रीम के लिए इसका सामान्य प्रभाव पड़ा होगा।
  • आपकी तीसरी धारणा सही है। हालांकि, 5.10.1 से शुरू होने पर यह PERL_UNICODE पर्यावरण चर या कुछ अन्य तंत्र के माध्यम से उचित झंडे सक्षम होने पर क्रोक नहीं होगा।
  • आपका चौथे धारणा है आम तौर पर सही नहीं। मुझे लगता है कि स्क्रिप्ट के साथ पर्ल दुभाषिया को एक तर्क के रूप में आमंत्रित करने के बजाए, जब आप स्क्रिप्ट को सीधे बुलाया जाता है, तो आप स्थिति का जिक्र कर रहे हैं। दो सामान्य मामले हैं।
    • एक प्रणाली है जहाँ ऑपरेटिंग सिस्टम निर्धारित करता है कि विस्तार के साथ किसी भी फाइल निष्पादन के लिए पर्ल दुभाषिया, विंडोज की तरह करने के लिए पारित हो जाएगा ".pl" पर, आप सही हो सकता है।लेकिन यह तर्क दिया जा सकता है कि -CSDA के बिना बुलाए जाने पर स्क्रिप्ट क्रोकिंग वांछित व्यवहार है, बजाय रहस्यमय रूप से विफल होने की वजह से मानक इनपुट और @ARGV स्क्रिप्ट की अपेक्षा के रूप में यूटीएफ -8 नहीं हैं।
    • जब एक स्क्रिप्ट सीधे निष्पादित की जाती है, तो शेबैंग लाइन को पढ़ते समय एक सिस्टम पर, अधिकांश * निक्स शैल की तरह, शेबैंग लाइन में निर्दिष्ट कमांड लाइन विकल्प का उपयोग दुभाषिया का आह्वान करते समय किया जाएगा और इसलिए -एससीडीए शेबैंग लाइन पर सम्मानित किया जाएगा।
+1

+1। आखिरी वस्तु के लिए, सिस्टम पर जहां/usr/bin/perl' दुभाषिया नहीं है लेकिन यह एक ऐसा प्रोग्राम है जो 'perl' के किस संस्करण को आमंत्रित करने का निर्णय लेता है (कहें, ओएस एक्स सिस्टम पर जहां '5.8' और' 5.10' सह-अस्तित्व में), शेबैंग लाइन पर '-CSDA'' को अंततः लागू होने पर 'perl' को क्रोक करने का कारण बनता है। –

+0

यह सच था, यह रैपर स्क्रिप्ट में एक बग होगा। लेकिन जब मैंने इसे मैक पर चेक किया, तो मुझे पता चला कि समस्या वास्तव में है कि 5.10.0 (जो ओएस एक्स 10.6.6 के साथ आता है) -सी हमेशा, जबकि 5.10.1 (जो मेरे लिनक्स मशीन पर है) अगर निर्दिष्ट झंडे पहले से सक्रिय हैं तो इसे अनुमति देता है। शेबैंग पर perl5.8.9 निर्दिष्ट करना सम्मान -CSDA सही ढंग से करता है। – Anomie

+0

स्पष्टीकरण के लिए धन्यवाद। बहुत सराहना की। –

3

अपनी स्क्रिप्ट

#!/usr/bin/perl -CSDA 

है और आप

./script foo 

OS का उपयोग कर पर्ल का शुभारंभ करेंगे इस प्रकार अपनी स्क्रिप्ट शुरू करते हैं:

/usr/bin/perl -CSDA ./script foo 

परिवर्तन में अगर इस तरह के

/usr/bin/perl ./script foo 

का उपयोग कर ठीक -CSDA दूर करने के लिए नहीं है के रूप में गलत तरीके से स्क्रिप्ट लॉन्च करते हैं, व्यवहार केवल खेलने में आता है, ठीक स्क्रिप्ट सही ढंग से कॉल करने के लिए है।

+0

निर्भर करता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या इस कार्यक्रम के कामकाज पर '-CSDA' का कोई प्रभाव पड़ा है जिसे मैं समझने की कोशिश कर रहा हूं। –

+0

@Sinan Ünür, क्या आप STDOUT या STDERR पर प्रिंट करते हैं? क्या आप एसटीडीआईएन से पढ़ते हैं? फिर यदि आप एएससीआईआईआई रेंज के बाहर किसी भी चीज़ से निपटने की उम्मीद करते हैं, तो आपको इसका इस्तेमाल करना चाहिए या कुछ समकक्ष होना चाहिए। – ikegami

+0

हाँ, ठीक है, मुझे नहीं पता और यह समस्या का हिस्सा है। –

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