पर्ल फ्लैग -पे, -पी, -प, -डॉ, -ड, -इ-, -टी?


107

मैंने पर्ल कोड या स्क्रिप्ट चलाने के बहुत से तरीके देखे हैं, अलग-अलग झंडे के साथ। हालाँकि, जब मैं प्रत्येक ध्वज के अर्थ के लिए Google से कोशिश करता हूं, तो मुझे मुख्य रूप से सामान्य पर्ल साइटों के परिणाम मिलते हैं और झंडे या उनके उपयोग के बारे में कोई विशेष जानकारी नहीं मिलती है।

नीचे वे झंडे हैं जिनका मैं सबसे अधिक बार सामना करता हूं, और मेरे पास कोई सुराग नहीं है कि उनका क्या मतलब है:

  • perl -pe
  • perl -pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

मैं बहुत आभारी रहूंगा यदि आप मुझे बताएं कि उनमें से प्रत्येक का क्या मतलब है और कुछ उनके लिए उपयोग के मामले हैं, या कम से कम मुझे उनके अर्थ का पता लगाने का एक तरीका बताएं।


21
पर्ल के बारे में बुनियादी उत्तरों के लिए गुगली करना आपको अक्सर कुछ वास्तव में अनपेक्षित साइटों तक ले जाएगा। हमेशा पहले स्वयं के दस्तावेज़ की जाँच करें।
ysth


2
Seconded। इस मामले में, perldoc perlrunसभी कमांड-लाइन विकल्पों की एक सूची है पर्ल पर्ल स्वीकार करता है।
शरम पेंडले

1
Google समस्या: माइनस साइन की व्याख्या Google द्वारा की गई है जिसका अर्थ है "इस शब्द को बाहर करना।" इस व्यवहार से बचने के लिए पद को उद्धरण में ऋण चिह्न पर रखें।
रोजर क्रुएगर

जवाबों:


147

हाँ, Google विराम चिह्नों को देखने के लिए बेहद मुश्किल है और दुर्भाग्य से, पर्ल ज्यादातर विराम चिह्नों से बना प्रतीत होता है :-)

कमांड लाइन स्विच सभी विस्तृत रूप से लंबन में हैं । (कॉल करके कमांड लाइन से उपलब्ध perldoc perlrun)

विकल्पों में संक्षेप में, एक-एक करके:

-p: अपने कमांड के चारों ओर एक प्रिंटिंग लूप रखें ताकि यह प्रत्येक पर कार्य करे
    मानक इनपुट की लाइन। ज्यादातर पर्ल का इस्तेमाल किया जा सकता है
    शक्ति और सादगी के मामले में पैंट बंद awk :-)
-n: अपने आदेश के चारों ओर एक गैर-मुद्रण लूप रखें।
-e: आपको कार्यक्रम को तर्क के रूप में प्रदान करने की अनुमति देता है
    एक फ़ाइल की तुलना में। आप एक स्क्रिप्ट बनाना नहीं चाहते हैं
    हर छोटे पर्ल वन-लाइनर के लिए फ़ाइल।
-i: अपनी इनपुट फ़ाइल को इन-प्लेस संशोधित करता है (बैकअप बना रहा है)
    मूल)। {कॉपी के बिना फ़ाइलों को संशोधित करने के लिए आसान
    हटाएँ-मूल, नाम बदलें} प्रक्रिया।
-w: कुछ चेतावनियों को सक्रिय करता है। कोई भी अच्छा पर्ल कोडर इसका उपयोग करेगा।
-d: पर्ल डिबगर के तहत चलता है। अपना पर्ल कोड डीबग करने के लिए,
    जाहिर है।
-t: कुछ "दागी" (संदिग्ध) कोड को चेतावनी (उचित) के रूप में मानता है
    टेंट मोड इस संदिग्ध कोड पर त्रुटि करेगा)। गोमांस खाते थे
    पर्ल सुरक्षा, खासकर जब दूसरे के लिए कोड चल रहा हो
    उपयोगकर्ता, जैसे कि सेटुइड स्क्रिप्ट या वेब सामग्री।

1
मैंने ध्यान नहीं दिया कि आपने किसका उल्लेख किया है perldoc perlrun। मैंने अपना उत्तर हटा दिया है। :-)
एलन हाग्गै अलवी

4
-wआमतौर पर इससे बचा जा सकता है, वास्तव में, क्योंकि यह CPAN मॉड्यूल सहित सभी कोड के लिए चेतावनी को सक्षम करता है , जो कि चेतावनी को ध्यान में रखकर नहीं लिखे गए थे। परिणाम आम तौर पर बहुत शोर, साथ ही बहुत बेकार हैं।
डस्कवफ-एक्टिव-

9
-wआमतौर पर इसे टाला जाता है, लेकिन इसे use warningsअपने कोड में बदल देना चाहिए ।
प्लसप्लस

6
@duskwuff: आम तौर पर मैं सहमत हूं, और मैं use warningsअपने कोड में करता हूं, लेकिन -उनका एक उपयोग नहीं है - यह खराब लिखे CPAN मॉड्यूल को बाहर निकालने में मदद करता है। :-)
शेर पेंडले

2
@IanBytchek तर्क जो एक अतिरिक्त पैरामीटर ले सकता है / होना चाहिए वह संकुचित सूची के अंदर नहीं हो सकता है। -iबैकअप के लिए एक्सटेंशन लेता है। -eएक पर्ल कमांड लेता है। में -0ep आप पर्ल कह रहे हैं कि 'पी' एक तर्क के बजाय एक पर्ल आदेश है। यह सब अच्छा काम नहीं करेगा।
tjd

10

-pझंडा मूल रूप से साथ स्क्रिप्ट चलाता है

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e आपको एक स्क्रिप्ट पास करने की अनुमति देता है STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-iइंटरप्रेटर को निर्देश देता है कि STDINनिष्पादित स्क्रिप्ट द्वारा पास किए गए सभी डेटा को निष्क्रिय करना है।

-wके रूप में ही है use warnings;, लेकिन स्थानीय गुंजाइश के बजाय एक वैश्विक में

-d पर्ल डिबगर चलाता है


2
-wयह बिल्कुल वैसा ही नहीं है, जैसा use warningsकि बाद में स्थानीय फ़ाइल में
स्कैन किया जाता है

प्लसप्लस, ट्रू, पैचिंग जवाब।
zellio

2
स्क्रिप्ट को एक तर्क के रूप में पारित करना एसटीडीआईएन पर इसे पारित करने के समान नहीं है। -मैं तर्क सूची से फ़ाइल नाम लेता हूं, स्टडिन नहीं। जबकि एसटीडीआईएन अक्सर कंट्रोलिंग टर्मिनल से जुड़ा होता है, और शेल से विरासत में मिला होता है जो स्टडिन को पढ़ता है और तर्क सूची को पर्ल पर सेट करता है, वे एक ही बात नहीं हैं।
विलियम पुरसेल

8

अन्य उल्लिखित हैं। यदि आप B :: Deparse का उपयोग करते हैं, तो आप देख सकते हैं कि इसका क्या अर्थ है (ज्यादातर चीजों के लिए):

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1 को '???' द्वारा दर्शाया गया है, क्योंकि यह दूर अनुकूलित है।

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-i सेट $ ^ I, like

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

लेकिन याद रखें, <ARGV> 2-तर्क खुले का उपयोग करता है, इसलिए ऐसे फ़ाइलनाम नहीं हैं जो प्रारंभ > <या उसके साथ शुरू / समाप्त होते हैं |


4

एक महत्वपूर्ण ध्वज भी है -nजिसका उल्लेख सूची में नहीं है।

-nके रूप में ही काम करता है -p, केवल यह $_डिफ़ॉल्ट रूप से प्रिंट नहीं करता है । यह पाठ फ़ाइलों को फ़िल्टर करने में बहुत उपयोगी हो सकता है।

इस तरह पर्ल grep | sedएक सिंगल-लाइनर में बदल सकते हैं।

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

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

"संदेश पढ़े:" के बाद मिलने वाले प्रत्येक पूर्णांक मान का प्रिंट आउट लेगा, और अधिक कुछ नहीं।


इसे और सरल बनाया जा सकता है। "प्रिंट" $ 1 \ n "" की कोई आवश्यकता नहीं है। आप इसके बजाय "प्रिंट" का उपयोग कर सकते हैं।
बजे भक्षण किया

नहीं, यह ( ) के print $1रूप में ही नहीं है । printprint $_
रस्टीक्स

यह कर सकते हैं: echo abc | perl -nw -e "print if (1)"प्रिंट होगा abc$1संदर्भ के लिए कोई ज़रूरत नहीं है ।
ईलाज के लिए तैयार

@devouredelysium: हाँ, लेकिन पूरी लाइन को प्रिंट नहीं करना चाहता, लेकिन केवल संख्या नियमित अभिव्यक्ति से मेल खाती है।
इंगो ब्लेस्च्मिड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.