पर्ल की छिपी विशेषताएं?


143

पर्ल में कुछ वास्तव में उपयोगी लेकिन गूढ़ भाषा की विशेषताएं हैं जिन्हें आप वास्तव में उपयोगी काम करने के लिए नियोजित करने में सक्षम हैं?

दिशानिर्देश:

  • पर्ल कोर के जवाबों को सीमित करने की कोशिश करें और सीपीएएन को नहीं
  • कृपया एक उदाहरण और एक संक्षिप्त विवरण दें

अन्य भाषाओं में छिपी हुई विशेषताएँ भी छिपी हुई हैं:

(ये सभी कोरियन के जवाब से हैं )

  • सी
    • डफ का उपकरण
    • पोर्टेबिलिटी और स्टैंडर्डनेस
  • सी#
    • व्हॉट्सएप की सीमांकित सूचियों और तारों के उद्धरण
    • उपनाम योग्य नाम स्थान
  • जावा
    • स्थैतिक Initalizers
  • जावास्क्रिप्ट
    • कार्य प्रथम श्रेणी के नागरिक हैं
    • ब्लॉक स्कोप और क्लोजर
    • एक चर के माध्यम से अप्रत्यक्ष रूप से कॉलिंग के तरीके और एक्सेसर्स
  • माणिक
    • कोड के माध्यम से तरीकों को परिभाषित करना
  • पीएचपी
    • व्यापक ऑनलाइन प्रलेखन
    • जादू के तरीके
    • प्रतीकात्मक संदर्भ
  • अजगर
    • एक पंक्ति मूल्य स्वैपिंग
    • अपनी कार्यक्षमता के साथ मूल कार्यों को बदलने की क्षमता

अन्य छिपी विशेषताएं:

ऑपरेटर:

उद्धरण निर्माण:

सिंटेक्स और नाम:

मॉड्यूल, प्रगति और कमांड लाइन विकल्प:

चर:

नियंत्रण और प्रवाह नियंत्रण:

नियमित अभिव्यक्ति:

अन्य सुविधाओं:

अन्य चाल और मेटा-उत्तर:


यह सभी देखें:


इन विशेषताओं में से अधिकांश रोजमर्रा के उपयोग में हैं, कुछ पर्ल स्क्रिप्ट्स के बहुमत में होती हैं, और अधिकांश "अन्य" के तहत अन्य भाषाओं से अभी भी उपजी हैं, इन "छिपी" को कॉल करने से प्रश्न का इरादा बदल जाता है।
रीइनरईयरपोस्ट

जवाबों:


54

फ्लिप-फ्लॉप ऑपरेटर फ्लैग वेरिएबल का उपयोग किए बिना, फ़ाइल हैंडल द्वारा दिए गए रिकॉर्ड (आमतौर पर लाइनें) के माध्यम से लूपिंग करते समय पहली पुनरावृत्ति को रोकने के लिए उपयोगी है:

while(<$fh>)
{
  next if 1..1; # skip first record
  ...
}

भागो perldoc perlopऔर अधिक जानकारी और उदाहरण के लिए "फ्लिप फ्लॉप" के लिए खोज।


वास्तव में यह अवेक से लिया गया है, जहाँ आप दो पैटर्न के बीच फ्लिप-फ्लॉप कर सकते हैं पैटर्न 1, पैटर्न
ब्रूनो डी

15
स्पष्ट करने के लिए, इसका "छिपा हुआ" पहलू यह है कि यदि या तो स्केलर को ऑपरेंड किया जाता है .. '' एक स्थिर मान है जो इनपुट लाइन नंबर ($) की तुलना में अधिक है
माइकल कारमैन

47

पर्ल में कई गैर-स्पष्ट विशेषताएं हैं।

उदाहरण के लिए, क्या आप जानते हैं कि एक खोजकर्ता के बाद एक जगह हो सकती है?

 $ perl -wle 'my $x = 3; print $ x'
 3

या यदि आप प्रतीकात्मक संदर्भों का उपयोग करते हैं तो आप सब न्यूमेरिक नाम दे सकते हैं?

$ perl -lwe '*4 = sub { print "yes" }; 4->()' 
yes

"बूल" क्वैसी ऑपरेटर भी है, जो सच्चे भावों के लिए 1 और झूठे के लिए खाली स्ट्रिंग लौटाता है:

$ perl -wle 'print !!4'
1
$ perl -wle 'print !!"0 but true"'
1
$ perl -wle 'print !!0'
(empty line)

अन्य दिलचस्प चीजें: आपके साथ use overloadस्ट्रिंग शाब्दिक और संख्याओं को अधिभारित कर सकते हैं (और उदाहरण के लिए उन्हें BigInts या जो भी बनाते हैं)।

इनमें से कई चीजें वास्तव में कहीं दस्तावेज हैं, या दस्तावेज सुविधाओं से तार्किक रूप से अनुसरण करते हैं, लेकिन फिर भी कुछ बहुत अच्छी तरह से ज्ञात नहीं हैं।

अपडेट : एक और अच्छा। नीचे q{...}उद्धृत किए गए निर्माणों का उल्लेख किया गया था, लेकिन क्या आप जानते हैं कि आप अक्षरों को सीमांकक के रूप में उपयोग कर सकते हैं?

$ perl -Mstrict  -wle 'print q bJet another perl hacker.b'
Jet another perl hacker.

इसी तरह आप नियमित अभिव्यक्ति लिख सकते हैं:

m xabcx
# same as m/abc/

2
"क्या आप जानते हैं कि एक सतर्क के बाद एक जगह हो सकती है?" मैं पूरी तरह से भड़का हुआ हूं। वाह।
अरस्तू पैगाल्ट्ज़िस

1
ठंडा! !! $ undef_var एक चेतावनी नहीं बनाता है।
Axeman

4
मुझे लगता है कि परिसीमित तार को पत्र का उपयोग कर के अपने उदाहरण होना चाहिए " बस एक और पर्ल हैकर" नहीं बल्कि "जेट एक और पर्ल हैकर" = पी से
क्रिस लुट्ज़

सबसे बुरी बात यह है कि आप अन्य चीजों को भी सीमांकक के रूप में उपयोग कर सकते हैं। यहां तक ​​कि कोष्ठक बंद करना। निम्नलिखित मान्य हैं: s} regex} प्रतिस्थापन} xsmg; q] स्ट्रिंग शाब्दिक];
रेयान सी। थॉम्पसन

46

जादू ARGV के माध्यम से संपीड़ित फ़ाइलों के लिए समर्थन जोड़ें :

s{ 
    ^            # make sure to get whole filename
    ( 
      [^'] +     # at least one non-quote
      \.         # extension dot
      (?:        # now either suffix
          gz
        | Z 
       )
    )
    \z           # through the end
}{gzcat '$1' |}xs for @ARGV;

(शेल मेटाचेचर के साथ फ़ाइल नाम को संभालने के लिए आवश्यक $ _ के आसपास के उद्धरण)

अब यह <>सुविधा @ARGV".gz" या ".Z" के साथ समाप्त होने वाली किसी भी फाइल को विघटित करेगी।

while (<>) {
    print;
}

2
मुझे नहीं लगता कि आपको |प्रतिस्थापन में भागने की आवश्यकता है ।
क्रिस लुत्ज

मैं इसे घूर रहा हूं और मैं यह पता नहीं लगा सकता कि यह कैसे काम करता है। किस बिंदु zcat |पर पाइप के माध्यम से कमांड के रूप में पार्स किया जाता है?
ईथर

1
@ ईथर => पाइपों का पता लगाना दो वादों की एक विशेषता है, जिसे हीरा ऑपरेटर प्रत्येक फाइल को खोलने के दौरान हीरे ऑपरेटर का उपयोग करता है@ARGV
एरिक स्ट्रॉम

40

पर्ल में मेरी पसंदीदा विशेषताओं में से एक है बूलियन ||ऑपरेटर का उपयोग विकल्पों के एक सेट के बीच चयन करने के लिए।

 $x = $a || $b;

 # $x = $a, if $a is true.
 # $x = $b, otherwise

इसका मतलब है कि कोई लिख सकता है:

 $x = $a || $b || $c || 0;

से पहले सही मूल्य लेने के लिए $a, $bऔर $c, या का एक डिफ़ॉल्ट 0अन्यथा।

पर्ल 5.10 में, //ऑपरेटर भी है , जो बाएं हाथ की ओर लौटता है यदि यह परिभाषित किया गया है, और दाहिना हाथ पक्ष अन्यथा। निम्नलिखित चयन पहले परिभाषित मूल्य से $a, $b, $c, या 0अन्यथा:

$ x = $ a // $ b // $ c // 0;

इनका उपयोग उनके लघु-हाथ रूपों के साथ भी किया जा सकता है, जो चूक प्रदान करने के लिए बहुत उपयोगी हैं:

$ x = = 0; # यदि $ x गलत था, तो अब इसका मूल्य 0 है।

$ x // = 0; # यदि $ x अपरिभाषित था, तो अब इसका मूल्य शून्य है।

राम-राम,

पॉल


4
यह इतनी आम मुहावरा है कि यह शायद ही "छिपी" सुविधा के रूप में योग्य है।
माइकल कारमैन

3
शर्मनाक सुंदर प्रिंटर सोचता है // एक टिप्पणी है :)
जॉन फर्ग्यूसन

2
प्रश्न, क्या इन नए ऑपरेटरों का उपयोग करने के लिए "उपयोग सुविधा" है, या क्या वे डिफ़ॉल्ट रूप से सक्षम हैं? मैं अभी भी पर्ल 5.10 की सुविधाओं को झुका रहा हूं।
जे जे

6
// डिफ़ॉल्ट रूप से वहाँ है, कोई विशेष tweaks की जरूरत है। आप इसे डोर-पैच के साथ 5.8.x में भी बैकपोर्ट कर सकते हैं ... किसी भी सीपीएएन दर्पण पर लेखकों / आईडी / एच / एचएम / एचएमबीआरएंड / निर्देशिका को देखें। FreeBSD 6.x और उसके बाद यह आपके लिए उनके पर्ल पैकेज में करता है।
dland

2
जब || या // को {} के साथ जोड़ दिया जाता है, आप एक अधिक जटिल असाइनमेंट को अलग कर सकते हैं, अर्थात $ x = $ a || do {मेरे $ z; व्युत्पत्ति की 3 या 4 लाइनें; $ z};
आरईटी

39

ऑपरेटर्स ++ और यूनीरी - न केवल नंबरों पर काम करते हैं, बल्कि स्ट्रिंग्स पर भी काम करते हैं।

my $_ = "a"
print -$_

प्रिंट -ए

print ++$_

प्रिंट b

$_ = 'z'
print ++$_

प्रिंट


3
पेरलवार को उद्धृत करने के लिए: "ऑटो-डिक्रीमेंट ऑपरेटर जादुई नहीं है।" तो --तार पर काम नहीं करता है।
moritz

"z" के बाद "आ" प्राकृतिक तत्व प्रतीत नहीं होता है। मुझे अगले उच्चतम एएससीआई मूल्य की उम्मीद है, जो "{" है।
ईथर

4
एक प्रोग्रामर से मत पूछो कि "z" के बाद क्या आता है; एक मानव से पूछो। लंबी सूची में आइटम नंबर करने के लिए यह सुविधा महान है।
बैरी ब्राउन

17
जब पर्ल के लिए नया मैंने इस सुविधा को सटीक व्यवहार के साथ खुद को ए व्यवहार में लागू किया, तो इसे एक सहकर्मी को दिखाया जिसने मुझे हंसाया और कहा "मुझे आपको कुछ दिखाने दें"। मैं थोड़ा रोया लेकिन कुछ सीखा।
कोपा

2
@ अन्य - यदि आप चाहते हैं कि, संख्याओं का उपयोग करें और उन्हें ASCII के साथ निरूपित करें ord()। या, एक छोटी कक्षा लिखें और ऑपरेटरों को आपके लिए करने के लिए अधिभार दें।
क्रिस लुत्ज

36

चूंकि पर्ल के पास अन्य सूचियों से लगभग सभी "गूढ़" भाग हैं, इसलिए मैं आपको एक बात बताऊंगा जो पर्ल नहीं कर सकता है:

एक चीज़ जो पर्ल नहीं कर सकता, वह है आपके कोड में नंगे मनमाने यूआरएल, क्योंकि //ऑपरेटर का उपयोग नियमित अभिव्यक्ति के लिए किया जाता है।

बस अगर यह आपके लिए स्पष्ट नहीं था कि पर्ल में क्या सुविधाएँ हैं, तो शायद पूरी तरह से स्पष्ट प्रविष्टियों की एक चयनात्मक सूची है:

डफ डिवाइस - पर्ल में

पोर्टेबिलिटी और स्टैंडर्डनेस - सी कंपाइलर की तुलना में पर्ल के साथ अधिक कंप्यूटर होने की संभावना है

एक फ़ाइल / पथ हेरफेर वर्ग - फ़ाइल :: .net की तुलना में और भी अधिक ऑपरेटिंग सिस्टम पर काम करता है

व्हॉट्सएप सीमांकित सूचियों और स्ट्रिंग के लिए उद्धरण - पर्ल आपको अपनी सूची और स्ट्रिंग सीमांकक के लिए लगभग मनमाने उद्धरण चुनने की अनुमति देता है

अलग नामस्थान - पर्ल के पास ग्लोब असाइनमेंट हैं:

*My::Namespace:: = \%Your::Namespace

स्टैटिक इनिशियलाइज़र - पर्ल कंप्लाइज़ेशन और ऑब्जेक्ट इंस्टेंटिएशन के लगभग हर चरण में BEGIN(कोड पार्स से) (कोड पार्स के CHECKबाद) से import(मॉड्यूल इंपोर्ट पर) new(ऑब्जेक्ट इंस्ट्रूमेंटेशन) टू DESTROY(ऑब्जेक्ट विनाश) से END(प्रोग्राम एग्ज़िट) तक कोड चला सकता है।

कार्य प्रथम श्रेणी के नागरिक हैं - जैसे पर्ल में

ब्लॉक स्कोप और क्लोजर - पर्ल में दोनों हैं

एक चर के माध्यम से अप्रत्यक्ष रूप से कॉलिंग के तरीके और एक्सेसर्स - पर्ल भी ऐसा करता है:

my $method = 'foo';
my $obj = My::Class->new();
$obj->$method( 'baz' ); # calls $obj->foo( 'baz' )

कोड के माध्यम से तरीकों को परिभाषित करना - पर्ल यह भी अनुमति देता है :

*foo = sub { print "Hello world" };

व्यापक ऑनलाइन प्रलेखन - पर्ल प्रलेखन ऑनलाइन है और आपके सिस्टम पर भी संभव है

जब भी आप "noxisting" फ़ंक्शन को कॉल करते हैं, तो जादू की विधियाँ - AUTOLOAD फ़ंक्शन में पर्ल लागू होती हैं

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

एक पंक्ति मूल्य स्वैपिंग - पर्ल सूची असाइनमेंट की अनुमति देता है

अपनी कार्यक्षमता के साथ मूल कार्यों को बदलने की क्षमता

use subs 'unlink'; 
sub unlink { print 'No.' }

या

BEGIN{
    *CORE::GLOBAL::unlink = sub {print 'no'}
};

unlink($_) for @ARGV

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

9
"एक बात जो पर्ल नहीं कर सकता, वह है आपके कोड में नंगे मनमाने यूआरएल, क्योंकि // ऑपरेटर का उपयोग नियमित अभिव्यक्ति के लिए किया जाता है।" - यह सरासर बकवास है।

आपकी अंतर्दृष्टि के लिए धन्यवाद। मैंने नंगे http: // ... कुछ तरीकों को देखा है, स्रोत फ़िल्टर का उपयोग किए बिना पर्ल कोड में URL, और एक रास्ता नहीं मिला। फिर भी आप दिखा सकते हैं कि यह कैसे संभव है? // का उपयोग पर्ल वर्जन में नियमित भावों के लिए 5.8.x पर किया जाता है। 5.10 में इसे परिभाषित या असाइनमेंट के लिए फिर से तैयार किया गया है।
कोरियन

8
क्यों / तुम कहाँ होगा चाहते हैं अपने कोड में नंगे यूआरएल? मैं एक उदाहरण के बारे में नहीं सोच सकता।
त्याज्य

18
कोई नहीं चाहेगा कि, यह सिर्फ एक जावा मेमे हो। " foo.com " एक टिप्पणी में http: और फिर "foo.com" लेबल है। कुछ लोगों को यह दिलचस्प लगता है क्योंकि ... वे गूंगे हैं।
जॉकवे

35

स्वत: संचय । AFAIK कोई अन्य भाषा नहीं है


मुझे पता नहीं था कि पायथन, एट अल, ने इसका समर्थन नहीं किया।
स्किपहॉपी

@davidnicol: वाक़ई? क्या आप लिंक प्रदान कर सकते हैं? Google पर मेरी त्वरित खोज ने कुछ भी वापस नहीं किया। उन लोगों के लिए जो ECMAscript नहीं जानते हैं, जावास्क्रिप्ट के लिए सही नाम है। en.wikipedia.org/wiki/ECMAScript
JJ

1
और ऑटिविएशन को अक्षम करने के लिए एक मॉड्यूल है
एलेक्जेंडर सिओर्नी 10

1
@ ग्रेग लिंड - यह देखते हुए कि पायथन स्वचालित रूप से चर बनाता है जब भी आप पहली बार उन्हें असाइन करते हैं, तो स्वत: एकीकरण एकल टाइपो से बाहर राक्षसी समस्याएं पैदा करेगा।
क्रिस लुत्ज

3
@tchrist - a = [[x * y in y के लिए xrange (1,11)] में x के लिए xrange (1,11)]
सर्वव्यापी

31

पर्ल में लगभग किसी भी प्रकार की अजीब स्ट्रिंग को उद्धृत करना सरल है।

my $url = q{http://my.url.com/any/arbitrary/path/in/the/url.html};

वास्तव में, पर्ल में विभिन्न उद्धरण तंत्र काफी दिलचस्प हैं। पर्ल रेगेक्स-जैसे उद्धृत तंत्र आपको सीमांकक निर्दिष्ट करते हुए कुछ भी उद्धृत करने की अनुमति देता है। आप लगभग किसी भी विशेष वर्ण का उपयोग कर सकते हैं जैसे #, /, या खुले / निकट वर्ण जैसे (), [], या {}। उदाहरण:

my $var  = q#some string where the pound is the final escape.#;
my $var2 = q{A more pleasant way of escaping.};
my $var3 = q(Others prefer parens as the quote mechanism.);

उद्धरण तंत्र:

q: शाब्दिक उद्धरण; केवल चरित्र जिसे बच निकलने की आवश्यकता है, वह अंतिम चरित्र है। qq: एक व्याख्यात्मक उद्धरण; चर और भागने के पात्रों को संसाधित करता है। स्ट्रिंग के लिए बढ़िया जिसे आपको उद्धृत करने की आवश्यकता है:

my $var4 = qq{This "$mechanism" is broken.  Please inform "$user" at "$email" about it.};

qx: qq की तरह काम करता है, लेकिन फिर इसे सिस्टम कमांड के रूप में निष्पादित करता है, गैर संवादात्मक रूप से। मानक से उत्पन्न सभी पाठ लौटाता है। (पुनर्निर्देशन, यदि ओएस में समर्थित है, तो यह भी सामने आता है) साथ ही बैक कोट्स (`वर्ण) के साथ भी किया जाता है।

my $output  = qx{type "$path"};      # get just the output
my $moreout = qx{type "$path" 2>&1}; # get stuff on stderr too

qr: qq की व्याख्या करता है, लेकिन फिर इसे एक नियमित अभिव्यक्ति के रूप में संकलित करता है। रेगेक्स पर विभिन्न विकल्पों के साथ भी काम करता है। अब आप चर के रूप में regex को पास कर सकते हैं:

sub MyRegexCheck {
    my ($string, $regex) = @_;
    if ($string)
    {
       return ($string =~ $regex);
    }
    return; # returns 'null' or 'empty' in every context
}

my $regex = qr{http://[\w]\.com/([\w]+/)+};
@results = MyRegexCheck(q{http://myurl.com/subpath1/subpath2/}, $regex);

qw: एक बहुत, बहुत उपयोगी उद्धरण ऑपरेटर। व्हाट्सएप के एक उद्धृत सेट को शब्दों को एक सूची में बदल देता है। एक इकाई परीक्षण में डेटा भरने के लिए महान।


   my @allowed = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { });
   my @badwords = qw(WORD1 word2 word3 word4);
   my @numbers = qw(one two three four 5 six seven); # works with numbers too
   my @list = ('string with space', qw(eight nine), "a $var"); # works in other lists
   my $arrayref = [ qw(and it works in arrays too) ]; 

जब भी यह चीजों को स्पष्ट करता है, तो उनका उपयोग करने के लिए वे महान हैं। Qx, qq और q के लिए, मैं सबसे अधिक संभावना {} ऑपरेटरों का उपयोग करता हूं। Qw का उपयोग करने वाले लोगों की सबसे आम आदत आमतौर पर () ऑपरेटर है, लेकिन कभी-कभी आप qw // भी देखते हैं।


1
मैं कभी-कभी qw "" का उपयोग करता हूं ताकि सिंटैक्स हाइलाइटर्स इसे सही ढंग से हाइलाइट करें।
ब्रैड गिल्बर्ट

मेरे लिए SlickEdit में काम करता है। :)
रॉबर्ट पी

1
@ फेंगशुन, जिन संपादकों का मैं आमतौर पर उपयोग करता हूं, वे इन्हें सही ढंग से उजागर करते हैं। मैं बात कर रहा था, StackOverflow पर वाक्यविन्यास हाइलाइटर के हिस्से में।
ब्रैड गिल्बर्ट

@ ब्रैड गिल्बर्ट: स्टैक ओवरफ्लो नहीं कर सकता है (अच्छी तरह से, (नहीं) पार्स वर्थ
डिडली

my $moreout = qx{type "$path" 2>&1};... मुझे नहीं पता था कि आप ऐसा कर सकते हैं! [टीएम]
५१

27

वास्तव में छिपा नहीं है, लेकिन हर दिन पर्ल प्रोग्रामर सीपीएन के बारे में नहीं जानते हैं । यह विशेष रूप से उन लोगों पर लागू होता है जो पूर्णकालिक प्रोग्रामर नहीं हैं या पर्ल पूर्णकालिक में कार्यक्रम नहीं करते हैं।


27

"फॉर" स्टेटमेंट का उपयोग उसी तरह किया जा सकता है जैसे "पास्कल में" के साथ किया जाता है:

for ($item)
{
    s/&‎nbsp;/ /g;
    s/<.*?>/ /g;
    $_ = join(" ", split(" ", $_));
}

आप चर नाम को दोहराने के बिना एक ही चर के लिए s /// संचालन, आदि का अनुक्रम लागू कर सकते हैं।

ध्यान दें: ऊपर (& nbsp;) गैर-ब्रेकिंग स्पेस ने मार्कडाउन को रोकने के लिए इसमें यूनिकोड छिपाया है। इसे कॉपी न करें :)


और "मैप" एक ही चाल के रूप में अच्छी तरह से करता है ... नक्शा {....} $ आइटम; "ओवर" मैप के लिए "का उपयोग करने का एक फायदा यह होगा कि आप ब्रेक आउट के लिए अगले का उपयोग कर सकते हैं।
draegtun

2
इसके अलावा, आइटम को हेरफेर करने वाले कोड से पहले सूचीबद्ध किया जा रहा है, बेहतर पठनीयता के लिए अग्रणी है।
रॉबर्ट पी।

@ रोबर्टपी: यह काफी सही है। एक सामयिक विचार प्रवचन में उपयोगी है।
tchrist

26

क्वाडवर्ड ऑपरेटर मेरी पसंदीदा चीजों में से एक है। की तुलना करें:

my @list = ('abc', 'def', 'ghi', 'jkl');

तथा

my @list = qw(abc def ghi jkl);

बहुत कम शोर, आंख पर आसान। पर्ल के बारे में एक और अच्छी बात यह है कि एसक्यूएल लिखते समय वास्तव में याद आती है, यह है कि एक अनुगामी अल्पविराम कानूनी है:

print 1, 2, 3, ;

यह अजीब लग रहा है, लेकिन अगर आप कोड को अन्य तरीके से इंडेंट नहीं करते हैं:

print
    results_of_foo(),
    results_of_xyzzy(),
    results_of_quux(),
    ;

फ़ंक्शन कॉल में एक अतिरिक्त तर्क जोड़ने से आपको पिछली या अनुगामी लाइनों पर अल्पविराम के साथ फ़ेल होने की आवश्यकता नहीं है। सिंगल लाइन परिवर्तन का इसके आस-पास की लाइनों पर कोई प्रभाव नहीं पड़ता है।

यह चर कार्यों के साथ काम करने के लिए बहुत सुखद बनाता है। यह शायद पर्ल की सबसे कम रेटिंग वाली विशेषताओं में से एक है।


2
पर्ल के सिंटैक्स का एक दिलचस्प कोने का मामला यह है कि निम्नलिखित मान्य है: $ _ qw (सामान की एक सूची) के लिए {...}
ephemient

1
आप शब्दों को उद्धृत करने के लिए ग्लोब सिंटैक्स का दुरुपयोग भी कर सकते हैं, जब तक आप विशेष वर्णों का उपयोग नहीं करते हैं जैसे कि। *। तो आप लिख सकते हैंfor (<a list of stuff>) { ... }
moritz

1
@ कुशल: लगभग। यह केवल लेक्सिकल के साथ काम करता है: मेरी $ x qw (abc) के लिए {...} उदाहरण के लिए: $ _ qw (abc) {प्रिंट} के लिए # प्रिंट कुछ नहीं
dland

जब आप पर्ल के पसंदीदा डिफ़ॉल्ट का आनंद ले सकते हैं, तो उस अतिरिक्त लेक्सिकल को क्यों जोड़ें? के लिए (qw / abcd /) {प्रिंट; }
फेंगशुन

2
@ephemient, @fengshaun, @moritz, @dland: चलो "निर्धारित" यह में blead ; इस p5p धागे को देखें ।
tchrist

26

डेटा को पार्स करने की क्षमता सीधे एक डेटा ब्लॉक में चिपकाई जाती है । प्रोग्राम या इसी तरह खोले जाने के लिए परीक्षण फ़ाइल को सहेजने की आवश्यकता नहीं है। उदाहरण के लिए:

my @lines = <DATA>;
for (@lines) {
    print if /bad/;
}

__DATA__
some good data
some bad data
more good data 
more good data 

और छोटे परीक्षणों में बहुत उपयोगी है!
फेंगशुन

@peter मोर्टेनसेन आपके पास कई ब्लॉक कैसे होंगे? और आप एक ब्लॉक को कैसे समाप्त करते हैं?
टॉड

@ लोड: यह एलन का जवाब है (संशोधन सूची देखें)। उस उपयोगकर्ता को संबोधित करना बेहतर है। या, जैसा कि उपयोगकर्ता ने स्टैक ओवरफ्लो छोड़ दिया है, शायद कोई भी विशेष रूप से संबोधित नहीं करता है (इसलिए एक वास्तविक पर्ल विशेषज्ञ इसे बाद में सीधा कर सकता है)।
पीटर मॉर्टेंसन

3
@ जय: नहीं, यह बदसूरत नहीं है - वास्तव में, यह बदसूरत के बिल्कुल विपरीत है: यह साफ, स्वेल्ट, न्यूनतम और सुंदर है; एक शब्द में, यह अद्भुत है, और इसके बिना भाषा एक PITA हैं। @peter mortensen, @toad: एक ही प्रोग्राम में एक से अधिक डेटा ब्लॉक रखने का एक उत्तर यह है कि CPAN से Inline :: Files मॉड्यूल का उपयोग करना।
tchrist

इनलाइन :: फ़ाइलें स्रोत फ़िल्टर का उपयोग करके कार्यान्वित की जाती हैं। इसमें डेटा :: अनुभाग भी है जो कई इनलाइन ब्लॉक प्रदान करता है और स्रोत फिल्टर का उपयोग नहीं करता है।
प्रकाश के

24

नए ब्लॉक संचालन

मैं कहूंगा कि भाषा का विस्तार करने की क्षमता, छद्म ब्लॉक संचालन बनाना एक है।

  1. आप एक उप-संकेत के लिए प्रोटोटाइप की घोषणा करते हैं जो यह दर्शाता है कि पहले एक कोड संदर्भ लेता है:

    sub do_stuff_with_a_hash (&\%) {
        my ( $block_of_code, $hash_ref ) = @_;
        while ( my ( $k, $v ) = each %$hash_ref ) { 
            $block_of_code->( $k, $v );
        }
    }
  2. फिर आप इसे शरीर में इस तरह बुला सकते हैं

    use Data::Dumper;
    
    do_stuff_with_a_hash {
        local $Data::Dumper::Terse = 1;
        my ( $k, $v ) = @_;
        say qq(Hey, the key   is "$k"!);
        say sprintf qq(Hey, the value is "%v"!), Dumper( $v );
    
    } %stuff_for
    ;

( Data::Dumper::Dumperएक और अर्ध-छिपी मणि है।) ध्यान दें कि subब्लॉक के सामने आपको कीवर्ड की आवश्यकता नहीं है , या हैश से पहले अल्पविराम। यह बहुत कुछ देख कर समाप्त होता है:map { } @list

स्रोत फ़िल्टर

इसके अलावा, स्रोत फिल्टर हैं। जहां पर्ल आपको कोड पास करेगा, ताकि आप इसमें हेरफेर कर सकें। यह और ब्लॉक ऑपरेशन, दोनों ही बहुत कुछ नहीं हैं, यह इस प्रकार की घरेलू चीजें हैं।

मैंने स्रोत फिल्टर के साथ कुछ साफ-सुथरी चीजें की हैं, उदाहरण के लिए जैसे समय की जाँच करने के लिए एक बहुत ही सरल भाषा बनाना, कुछ निर्णय लेने के लिए शॉर्ट पर्ल वन-लाइनर्स की अनुमति देना:

perl -MLib::DB -MLib::TL -e 'run_expensive_database_delete() if $hour_of_day < AM_7';

Lib::TL बस "चर" और स्थिरांक दोनों के लिए स्कैन कर सकते हैं, उन्हें बना सकते हैं और उन्हें आवश्यकतानुसार प्रतिस्थापित कर सकते हैं।

फिर, स्रोत फ़िल्टर गड़बड़ हो सकते हैं, लेकिन शक्तिशाली हैं। लेकिन वे डिबगर्स को कुछ भयानक गड़बड़ कर सकते हैं - और यहां तक ​​कि चेतावनियों को गलत लाइन नंबरों के साथ मुद्रित किया जा सकता है। मैंने डेमियन स्विच का उपयोग करना बंद कर दिया क्योंकि डिबगर मुझे यह बताने की सभी क्षमता खो देगा कि मैं वास्तव में कहां था। लेकिन मैंने पाया है कि आप कोड के छोटे वर्गों को संशोधित करके क्षति को कम कर सकते हैं, उन्हें एक ही पंक्ति में रख सकते हैं।

सिग्नल हुक

यह अक्सर पर्याप्त होता है, लेकिन यह सब स्पष्ट नहीं है। यहाँ एक डाई हैंडलर है जो पिगी पुराने पर वापस आ गया है।

my $old_die_handler = $SIG{__DIE__};
$SIG{__DIE__}       
    = sub { say q(Hey! I'm DYIN' over here!); goto &$old_die_handler; }
    ;

इसका मतलब है कि जब भी कोड में कोई अन्य मॉड्यूल मरना चाहता है, तो वे आपके पास आते हैं (जब तक कि कोई और विनाशकारी अधिलेखित नहीं करता है $SIG{__DIE__})। और आपको सूचित किया जा सकता है कि किसी चीज़ में कुछ त्रुटि है।

बेशक, पर्याप्त चीजों के लिए आप बस एक END { }ब्लॉक का उपयोग कर सकते हैं , अगर आप जो करना चाहते हैं, वह साफ है।

overload::constant

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

overload::constant 
    integer => sub { 
        my $lit = shift;
        return $lit > 2_000_000_000 ? Math::BigInt->new( $lit ) : $lit 
    };

इसका मतलब यह होगा कि कॉलिंग पैकेज में 2 बिलियन से अधिक के प्रत्येक पूर्णांक को Math::BigIntऑब्जेक्ट में बदल दिया जाएगा । (देखें अधिभार :: स्थिर )।

समूहीकृत इंटीग्रल साहित्य

जबकि हम इस पर हैं। पर्ल आपको बड़ी संख्या में तीन अंकों के समूहों में विभाजित करने की अनुमति देता है और फिर भी इसमें से एक पार्सबल पूर्णांक प्राप्त करता है। 2_000_000_0002 बिलियन से ऊपर का नोट ।


5
$ SIG { DIE } संचालकों का उपयोग करते समय , इसकी दृढ़ता से अनुशंसा की जाती है कि आप $ ^ S का निरीक्षण करें कि क्या आपका कार्यक्रम वास्तव में मर रहा है, या केवल एक अपवाद फेंक रहा है जो पकड़ा जा रहा है। आमतौर पर आप बाद के साथ हस्तक्षेप नहीं करना चाहते हैं।
pjf

नया ब्लॉक बहुत शिक्षाप्रद है! मैं सोच रहा था कि यह एक भाषा शब्दार्थ था! बहुत धन्यवाद।
शून्यकाल

स्रोत फ़िल्टर का एक शिक्षाप्रद प्रयोग है pdl का NiceSlice ( pdl.perl.org/?docs=NiceSlice&title=PDL::NiceSlice ) ताकि किसी को ->sliceहर बार एक स्लाइस की आवश्यकता होने पर विधि के रूप में उपयोग करने की आवश्यकता न हो ।
जोएल बर्जर

24

बाइनरी "एक्स" दोहराव ऑपरेटर है :

print '-' x 80;     # print row of dashes

यह सूचियों के साथ भी काम करता है:

print for (1, 4, 9) x 3; # print 149149149

यह एक कारण है कि पर्ल हैकर्स के साथ इतना लोकप्रिय क्यों रहा है। perl -e 'Print 0x000 x 25';
जेजे

4
इसके लिए मेरा पसंदीदा उपयोग SQL INSERT स्टेटमेंट के अंतिम भाग के लिए प्लेसहोल्डर तैयार कर रहा है: @p = ('?') X $ n; $ p = join (",", @p); $ sql = "INSERT ... VALUES ($ p)";
स्किप्टॉपी

24

दागी जाँच। -tयदि आप दागी डेटा (मोटे तौर पर बोलना, प्रोग्राम के बाहर से डेटा) एक असुरक्षित फ़ंक्शन (एक फ़ाइल खोलना, एक बाहरी कमांड चलाना, आदि) को पारित करने की कोशिश करते हैं , तो टेंट चेकिंग सक्षम होने के साथ, पर्ल मर जाएगा (या चेतावनी के साथ )। सेतु लिपियों या सीजीआई या ऐसी किसी भी चीज़ को लिखते समय यह बहुत मददगार होता है, जहाँ लिपि में डेटा को फीड करने वाले व्यक्ति की तुलना में अधिक विशेषाधिकार होते हैं।

मैजिक गोटो। goto &subएक अनुकूलित पूंछ कॉल करता है।

डिबगर।

use strictऔर use warnings। ये आपको टाइपोस के एक समूह से बचा सकते हैं।


1
अन्य भाषाओं में यह सुविधा क्यों नहीं है? इस सुविधा का उपयोग पर्ल वेब स्क्रिप्ट को परिमाण के एक आदेश को अधिक सुरक्षित बनाता है।
मैथ्यू लॉक

22

Perl 5 में जिस तरह से "-n"और "-p"स्विच लागू किए गए हैं , उसके आधार पर , आप एक उचित गलत प्रोग्राम लिख सकते हैं जिनमें शामिल हैं }{:

ls |perl -lne 'print $_; }{ print "$. Files"'

जिसे इस कोड में आंतरिक रूप से परिवर्तित किया गया है:

LINE: while (defined($_ = <ARGV>)) {
    print $_; }{ print "$. Files";
}

@ मार्टिन क्लेटन: इसे क्यों कहा जाता है?
tchrist

@ टिचर - क्योंकि यह, माना जाता है, दो लोगों को नाक रगड़ता हुआ दिखता है। प्रोफ़ाइल में, यदि आप देखते हैं कि मेरा क्या मतलब है।
मार्टिन क्लेटन

18

चलो अंतरिक्ष यान संचालक के साथ आसान शुरू करते हैं ।

$a = 5 <=> 7;  # $a is set to -1
$a = 7 <=> 5;  # $a is set to 1
$a = 6 <=> 6;  # $a is set to 0

1
@Leon: C / C ++ संख्याओं के लिए 3 मान वापसी नहीं करता है। यदि मेमोरी स्ट्रींग कोमप्रे कार्य करता है तो केवल 3 मूल्य वापसी है जो मुझे पूरे एसटीएल भाषा में पता है। AFAIK पायथन में 3 रिटर्न संख्यात्मक तुलना नहीं है। जावा में एक नंबर विशिष्ट 3 रिटर्न की तुलना नहीं है।
जेजे

7
यह ध्यान देने योग्य है कि -1/0/1 तुलनात्मक ऑपरेटरों के बारे में क्या उपयोगी है, क्योंकि सभी को पता नहीं हो सकता है: आप उन्हें प्राथमिक / माध्यमिक / आदि करने के लिए या ऑपरेटर के साथ मिलकर चेन कर सकते हैं। प्रकार। इसलिए ($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)लोगों को उनके अंतिम नामों के आधार पर क्रमबद्ध करें, लेकिन अगर दो लोगों का नाम एक ही अंतिम नाम है, तो उन्हें उनके पहले नाम से आदेश दिया जाएगा।
जूल

@JJ पायथन में 3-मूल्य की तुलना है: cmp () >>> प्रिंट (cmp (5,7), cmp (6,6), cmp (7,5)) - -1, 0, 1)
bukzor

18

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

मेरे कुछ पसंदीदा सुझावों में PAR के साथ निष्पादक निर्माण शामिल हैं , स्वतः अपवादों को फेंकने के लिए ऑटोडी का उपयोग करना और पर्ल 5.10 में स्विच और स्मार्ट-मैच निर्माण का उपयोग करना।

प्रकटीकरण: मैं पर्ल टिप्स के लेखकों और अनुरक्षकों में से एक हूं, इसलिए मुझे स्पष्ट रूप से उनमें से बहुत अधिक लगता है। ;)


2
यह शायद वहाँ से बाहर सबसे अच्छी प्रलेखित भाषाओं में से एक है, और दस्तावेज़ों को खोजने के लिए उपकरणों के लिए पैटर्न निर्धारित किया है। इस प्रश्न की सूची अन्य भाषाओं के लिए शायद उतनी आवश्यक नहीं है।
Axeman

1
ऑटोडी बहुत अच्छी लगती है।
j_random_hacker

18

नक्शा - न केवल इसलिए कि यह किसी के कोड को अधिक अभिव्यंजक बनाता है, बल्कि इसलिए कि इससे मुझे इस "कार्यात्मक प्रोग्रामिंग" के बारे में थोड़ा और पढ़ने के लिए एक आवेग मिला।


15

लूप पर जारी खंड। यह हर लूप के तल पर निष्पादित किया जाएगा, यहां तक ​​कि जो भी नेक्स्ट हैं।

while( <> ){
  print "top of loop\n";
  chomp;

  next if /next/i;
  last if /last/i;

  print "bottom of loop\n";
}continue{
  print "continue\n";
}

15

मेरा वोट पर्ल के नियमित अभिव्यक्तियों में (? {}) और (?? {}) समूहों के लिए जाएगा। पहला पर्ल कोड को निष्पादित करता है, वापसी मूल्य को अनदेखा करता है, दूसरा एक नियमित अभिव्यक्ति के रूप में रिटर्न मूल्य का उपयोग करते हुए कोड निष्पादित करता है।


perl ने इतने सारे regexp एक्सटेंशन का आविष्कार किया कि अन्य प्रोग्राम अब मूल रेगेक्स भाषा के बजाय pcre (पर्ल संगत रेगेक्स) का उपयोग करते हैं।
सेकेंड

यहाँ पर थोड़ा ब्लर्ब पढ़ें perldoc.perl.org/… :-D
JJ

पर्ल के पास वास्तव में (जहां तक ​​मुझे पता है), पैक का नेतृत्व करते हैं, जब यह regexps की बात आती है।
ब्रैड गिल्बर्ट

यह, जहां तक ​​मुझे पता है, अभी भी प्रायोगिक है, और भविष्य के पर्ल्स में भी उसी तरह काम नहीं कर सकता है। यह कहने के लिए नहीं कि यह उपयोगी नहीं है, लेकिन थोड़ा सुरक्षित और जैसा कि उपयोग करने योग्य संस्करण s /// कमांड के / ई ध्वज में पाया जा सकता है: s/(pattern)/reverse($1);/ge;# सभी को उलट देता है patterns
क्रिस लुत्ज़

@ क्रिस लुत्ज़, @ एलोन टिमरमैन: ध्यान दें कि वे दो निर्माण अब नए हैं। यह भी ध्यान दें कि दूसरे को अब पुनरावर्ती पैटर्न को प्रभावित करने के लिए उपयोग करने की आवश्यकता नहीं है, अब जब हम कैप्चर समूहों पर पुनरावृत्ति कर सकते हैं। @ ब्रैड गिल्बर्ट: यह सही है, हालाँकि PCRE हमें ट्रैक करने का एक अच्छा काम करता है; रेगेक्स उत्कृष्टता का एक क्षेत्र जहां पर्ल पूरी तरह से अप्रकाशित है, इसकी यूनिकोड संपत्तियों तक पहुंच है; की मेरी unitrio वितरण देखना uninames, unicharsऔर विशेष रूप से unipropsमैं क्या मतलब का कोई हिस्सा देखने के लिए।
tchrist

13
while(/\G(\b\w*\b)/g) {
     print "$1\n";
}

\ G लंगर। यह गर्म है


3
... और यह पिछले मैच के अंत की स्थिति को दर्शाता है।
डेव शेरोहमान

1
लेकिन आपको अपने रेगेक्स को स्केलर संदर्भ में कॉल करना होगा।
davidnicol

@davidnicol: उपरोक्त कोड काम करता है। क्या आप स्पष्ट कर सकते हैं कि आपका क्या मतलब है?
जेजे

13

m//ऑपरेटर कुछ अस्पष्ट विशेष मामलों है:

  • यदि आप ?सीमांकक के रूप में उपयोग करते हैं तो यह केवल एक बार मेल खाता है जब तक आप कॉल नहीं करते हैं reset
  • यदि आप 'सीमांकक के रूप में उपयोग करते हैं तो पैटर्न प्रक्षेपित नहीं होता है।
  • यदि पैटर्न खाली है, तो यह पिछले सफल मैच से पैटर्न का उपयोग करता है।

2
ये छुपी हुई विशेषताओं की तुलना में छिपे हुए गोचरों की तरह हैं! मैं किसी को नहीं जानता जो उन्हें पसंद करता है। कुछ समय पहले p5p पर एक थ्रेड ने एक सूचक मी / $ foo / r फ्लैग की उपयोगिता पर चर्चा की, जहाँ / r का अर्थ होगा कोई प्रक्षेप (अक्षर महत्वपूर्ण नहीं है) क्योंकि कोई भी एकल उद्धरण चीज़ को कभी भी याद नहीं रख सकता है।
dland

2
@ डलैंड: सहमत; मैं इन छिपी हुई गलत विशेषताओं को कॉल करूंगा और उत्पादन कोड में उनका उपयोग कभी नहीं करूंगा।
माइकल कारमैन

7
मैं एक पर्ल प्रोग्रामर को याद करने में असमर्थ होने की कल्पना नहीं कर सकता (या यहां तक ​​कि लगता है) कि एकल उद्धरण बिना किसी प्रक्षेप के खड़े हैं। इस शब्दार्थ के साथ इसका उपयोग लगभग उस भाषा में सार्वभौमिक है जिसकी मैं अपेक्षा करता हूं कि यह ऐसा हो ...
sundar -

और यदि पैटर्न खाली है और अंतिम सफल मिलान / o संशोधक के साथ संकलित किया गया था, तब से यह उस पैटर्न पर अटक जाएगा।
davidnicol

1
मुझे लगता है कि खाली पैटर्न व्यवहार को हटा दिया गया है। मुख्य रूप से क्योंकि $ foo खाली होने पर m / $ foo / जैसा पैटर्न गंदा बग बन जाता है।
मैथ्यू एस

12

नल फ़ाइलहैंड डायमंड ऑपरेटर <> का कमांड लाइन टूल बनाने में अपना स्थान है। यह <FH>एक हैंडल से पढ़ना पसंद करता है , सिवाय इसके कि यह जादुई रूप से जो भी पहले मिले, कमांड लाइन फाइल या एसटीडीआईएन का चयन करता है। पेरलोप से लिया गया:

while (<>) {
...         # code for each line
}

4
यह स्टैडेन से "-" टू मीन "पढ़ने के लिए UNIX शब्दार्थ का भी अनुसरण करता है। इसलिए आप ऐसा कर सकते हैं perl myscript.pl file1.txt - file2.txt, और पर्ल पहले फाइल को प्रोसेस करेगा, फिर स्टडिन को, फिर दूसरी फाइल को।
रेयान सी। थॉम्पसन

आप कर सकते हैं अपने खुद के वस्तुओं पर ऑपरेटर ( ) पुनरावर्तक की तरह काम करने के लिए। हालाँकि यह काम नहीं करता है क्योंकि आप सूची के संदर्भ में उम्मीद कर सकते हैं। overload<><$var>
dolmen

11

विशेष कोड ब्लॉक जैसे BEGIN, CHECKऔर END। वे ऑक से आते हैं, लेकिन पर्ल में अलग तरीके से काम करते हैं, क्योंकि यह रिकॉर्ड-आधारित नहीं है।

BEGINब्लॉक पार्स चरण के लिए कुछ कोड निर्दिष्ट करने के लिए इस्तेमाल किया जा सकता; जब आप सिंटैक्स-और-चर-चेक करते हैं तो इसे भी निष्पादित किया जाता है perl -c। उदाहरण के लिए, कॉन्फ़िगरेशन चर में लोड करने के लिए:

BEGIN {
    eval {
        require 'config.local.pl';
    };
    if ($@) {
        require 'config.default.pl';
    }
}

11
rename("$_.part", $_) for "data.txt";

data.txt.part का नाम बदलकर खुद को दोहराना नहीं है।


10

थोड़ा अस्पष्ट टिल्ड-टिल्ड "ऑपरेटर" है जो स्केलर संदर्भ को मजबूर करता है।

print ~~ localtime;

के समान है

print scalar localtime;

और से अलग है

print localtime;

5
यह विशेष रूप से अस्पष्ट है क्योंकि perl5.10.0 भी "स्मार्ट मैच ऑपरेटर" का परिचय देता है ~~, जो रेगेक्स मैच कर सकता है, यह देख सकता है कि क्या कोई आइटम किसी सरणी में निहित है और इसी तरह।
मोरिट्ज़ 12

यह अस्पष्ट नहीं है, यह अस्पष्ट है (और गोल्फ और JAPHs के लिए उपयोगी)।
माइकल कारमैन

यह सही नहीं है! ~~ संदर्भों पर सुरक्षित नहीं है! यह उन्हें कठोर बनाता है।
लियोन टिम्मरमन्स

सही है। स्ट्रिंगर संदर्भ में मजबूर होने पर संदर्भों का उल्लंघन होता है। यह कैसे "~~ ताकतों स्केलर संदर्भ" को गलत बनाता है?
डेव शेरोहमान

3
@ नोमाड दरविश: स्केलर संदर्भ / = कठोरता। उदाहरण के लिए "$ n = @ ए" अदिश संदर्भ है। "$ s = qq '@ a'" स्ट्रिंग है। संदर्भों के संबंध में, "$ ref1 = $ ref2" अदिश संदर्भ है, लेकिन यह कठोर नहीं है।
माइकल कारमैन

9

टाई, चर बांधने वाला इंटरफ़ेस।


टाई :: फ़ाइल मेरे दिन को एक बार बचाया!
mhd

9

पर्ल के लूप नियंत्रण का "हताशा मोड" निर्माण करता है जो उन्हें एक मिलान लेबल खोजने के लिए स्टैक को देखने के लिए प्रेरित करता है जो कुछ जिज्ञासु व्यवहारों की अनुमति देता है जो टेस्ट :: अधिक का फायदा उठाता है, बेहतर या बदतर के लिए।

SKIP: {
    skip() if $something;

    print "Never printed";
}

sub skip {
    no warnings "exiting";
    last SKIP;
}

छोटी ज्ञात .pmc फ़ाइल है। "उपयोग फू" Foo.pm से पहले @INC में Foo.pmc की तलाश करेगा। इसका उद्देश्य पहले संकलित बायटेकोड को लोड करने की अनुमति देना था, लेकिन मॉड्यूल :: कंपाइल इसका फायदा उठाते हुए तेजी से लोड समय और आसान डीबगिंग के लिए स्रोत फ़िल्टर किए गए कैश को बढ़ाता है।

चेतावनियों को त्रुटियों में बदलने की क्षमता।

local $SIG{__WARN__} = sub { die @_ };
$num = "two";
$sum = 1 + $num;
print "Never reached";

यही मैं अपने सिर के ऊपर से सोच सकता हूं जिसका उल्लेख नहीं किया गया है।


9

बकरी ऑपरेटर *:

$_ = "foo bar";
my $count =()= /[aeiou]/g; #3

या

sub foo {
    return @_;
}

$count =()= foo(qw/a b c d/); #4

यह काम करता है क्योंकि स्केलर संदर्भ में सूची असाइनमेंट सूची में तत्वों की संख्या को असाइन किया जा रहा है।

* ध्यान दें, वास्तव में एक ऑपरेटर नहीं है


यह सबसे (अच्छी तरह से, कम से कम) सुंदर "ऑपरेटर" है।
क्रिस लुत्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.