2008-10-03 3 views
13

प्रश्न यह नहीं है कि ऑनलाइन पर कैसे बताना है। यदि आप एक लाइनर में कोड लिख रहे हैं, आप जानते हैं कि आप हैं। लेकिन -MMy::Module::Name द्वारा शामिल मॉड्यूल को कैसे पता चलता है कि यह सब एक ऑनलाइन से शुरू हुआ है।यह बताए जाने का सबसे अच्छा तरीका क्या है कि आपका पर्ल चल रहा है या नहीं?

यह मेरा है। हालांकि यह गैर पोर्टेबल है और यूनिक्स मानक आदेशों पर निर्भर करता है (हालांकि, यह पोर्टेबल और अधिक या कम किया जा सकता है।)

my $process_info = `ps $$ | tail -1`; 
my $is_oneliner 
    = $process_info =~ m/perl.*?\s+-[^\P{IsLower}e]*e[^\P{IsLower}e]*\s+/m 
    ; 

और यदि आप एक snazzier regex है, मेरा सुधार कर सकते हैं।


कुछ लोगों ने पूछा है कि मैं ऐसा क्यों करना चाहता हूं। ब्रायन ने सही ढंग से अनुमान लगाया कि मैं निर्यात स्क्रिप्ट को बदलना चाहता हूं कि यह एक स्क्रिप्ट है, जिसे हम मान सकते हैं कि इसमें कुछ मात्रा में डिज़ाइन है, या यह एक ऑनलाइनर है जहां उपयोगकर्ता एक कमांड लाइन में जितना संभव हो सके करने की कोशिश कर रहा है।

यह बुरा लग रहा है इस मूलमंत्र है कि निर्यातकों अन्य पैकेजों का सम्मान करना चाहिए क्योंकि - "! @EXPORTबुराई है" कभी कभी जाना जाता है के रूप में लेकिन मुझे लगता है कि ऑनलाइनरों पर लागू होने पर यह मूर्खतापूर्ण स्थिरता है। सभी पर्ले स्वयं अपनी भाषा की संरचना का उल्लंघन करने के तरीके से बाहर निकलते हैं और यदि आप कमांड लाइन पर उनसे पूछते हैं तो आसान लूप देते हैं, मैं बस अपने परिचालन/व्यापार डोमेन के लिए उस विचार को विस्तारित करना चाहता हूं। मैं स्रोत फ़िल्टर (गैसपी!) भी लागू करना चाहता हूं, अगर यह मदद करता है।

लेकिन यह प्रश्न यह भी सुझाव देता है कि मैं पर्ल का भी एक अच्छा नागरिक बनना चाहूंगा, क्योंकि मैं केवल कुछ मामलों में समुदाय दिशानिर्देश तोड़ना चाहता हूं। यह एक नया नया मॉड्यूल लिखने के बजाय बैच शेड्यूलर में कमांड लाइन को बदलकर केवल प्रमुख व्यापार-स्तरीय कार्रवाइयां बनाने में सक्षम होने के लिए बहुत ही बढ़िया है। परीक्षण चक्र बहुत संकुचित है।

+0

मॉड्यूल कभी इस बात पर ध्यान क्यों देगा कि इसे इस तरह से बुलाया गया था? – moonshadow

उत्तर

34

$0"-e" पर सेट है यदि आप -e से चल रहे हैं।

+1

डी ओह! मैंने बहुत सारे चर मुद्रित किए, लेकिन मैंने ऐसा नहीं किया! – Axeman

+0

मुझे यह नहीं मिला कि पर्लवार में, क्या वह _documented_ कहीं भी है? – Axeman

+4

शायद यह केवल स्रोत में प्रलेखित है। :) लेकिन मुझे लगता है कि यह बहुत लंबे समय से सच रहा है। –

10

आप यह पता लगाने की कोशिश क्यों कर रहे हैं कि मॉड्यूल कमांड लाइन से शामिल था या नहीं? क्या आपके पास कुछ ऐसी स्थिति है जहां यह महत्वपूर्ण है? क्या आप आयात के साथ कुछ अजीब कर रहे हैं? हमें बताएँ कि आप क्या करने की कोशिश कर रहे हैं क्या और मैं शायद यह करने के लिए एक बेहतर तरीका है के साथ आ सकते हैं :)


ठीक है, आप निर्यात करने के बारे में पूछ रहे हैं। आप जिस समस्या को हल करने की कोशिश कर रहे हैं? आप इसे किस तरह से चाहते हैं? कमांड लाइन से अतिरिक्त या कम डिफ़ॉल्ट निर्यात? क्या आप जानते हैं कि आप निर्यात टैग समेत -एम के साथ एक आयात सूची निर्दिष्ट कर सकते हैं (इसलिए,% EXPORT_TAGS से कुछ)? और यदि आप एक खाली निर्यात सूची चाहते हैं, तो आप इसके बजाय -एम (लोअरकेस एम) का उपयोग कर सकते हैं। perlrun में -एम/-एम के लिए प्रविष्टि देखें।

आपको "मॉडुलिनो" चाल में भी रुचि हो सकती है जहां एक मॉड्यूल फ़ाइल मॉड्यूल और एक स्क्रिप्ट दोनों हो सकती है। आप या तो इसे नियमित मॉड्यूल के रूप में उपयोग कर सकते हैं, इस मामले में आपके पास इसके सभी तरीकों तक पहुंच है, या इसे एक स्क्रिप्ट के रूप में कॉल करें, जिस स्थिति में यह चलता है। मैं पर्ल जर्नल के साथ-साथ "How a Script Becomes a Module" पर परलोमक्स पर "Scripts as Modules" आलेख में इसका वर्णन करता हूं।

+0

हाँ, यह मूल रूप से यह है। - हमें सटीक परिभाषित स्क्रिप्ट्स से अधिक निर्यात मिलता है जो कम से कम एक डिज़ाइन किए गए पैकेज स्थान का सुझाव देते हैं। मैं एक oneliner के मुख्य सम्मान के बारे में चिंतित नहीं हूँ। – Axeman

+0

ब्रायन: आपके "मॉडुलिनो" आलेख में प्रस्तुत विचार/अविश्वसनीय/उपयोगी हैं। यह दोनों 'हैकी' स्क्रिप्ट को हतोत्साहित करता है, और तत्काल पुन: प्रयोज्यता प्रदान करता है। इसे प्यार करो, और मैं इसे सोमवार को आंतरिक कोडिंग दिशानिर्देशों में जोड़ने का प्रस्ताव देने जा रहा हूं - हमारी समस्याओं में से एक स्क्रिप्ट है ... – Dan

+0

... छोटे और थोड़ा हैकिश शुरू करें, धीरे-धीरे एक अनावश्यक आकार में बढ़ रहा है , जल्दी या बाद में कार्यक्षमता की आवश्यकता कहीं और होती है, इसलिए पूरे गड़बड़ी को रिफैक्टरिंग की आवश्यकता होती है (जो शायद ही कभी आसानी से चला जाता है)। यह पूरी तरह से समस्या को हटा देना चाहिए। – Dan

1

आपके import() में, caller() द्वारा लौटाई गई लाइन संख्या 0 होगी यदि आपका मॉड्यूल -M के माध्यम से लोड किया गया था। यह सच है जब भी -M का उपयोग किया जाता है (के साथ या नहीं) लेकिन मुझे लगता है कि यह एकमात्र मामला है जहां लाइन नंबर 0 है।

+0

perl -le '# line 0' -e'sub {प्रिंट शामिल हों ":", कॉलर} ->() ' – ysth

+0

perl -le' # line 1 '-e'sub {प्रिंट शामिल हों ":", कॉलर} - >() ' –

1

यदि आप विभिन्न निर्यात व्यवहार चाहते हैं, तो इसे करने के लिए "साफ" तरीका एक अलग मॉड्यूल नाम का उपयोग करेगा। यदि आप वास्तव में बहुत सारे लाइनर उपयोग करने की अपेक्षा करते हैं, तो आप इसे संक्षिप्त नाम भी दे सकते हैं। जैसे एमएमएनपीएम:

package MMN; 
use My::Module::Name '/./'; 
use Exporter(); 
@ISA = 'Exporter'; 
@EXPORT = @My::Module::Name::EXPORT_OK; 
1; 

ध्यान दें कि निर्यातक के पास थोड़ा ज्ञात रेगेक्स सुविधा है; आप बस

perl -MMy::Module::Name=/./ -e ... 
+0

मुझे नहीं पता कि यह इतना साफ है, लेकिन मेरे पास पहले से ही कमांड लाइन आमंत्रण के नामों को छोटा करने की योजना है। – Axeman