2011-09-05 13 views
16
package a; 
sub func { 
print 1; 
} 
package main; 
a::->func; 

आईएमओ a::func, a->func होने के लिए पर्याप्त है।`a :: -> func;` मान्य क्यों है?

a::->func; मेरे लिए बहुत अजीब लग रहा है, क्यों पर्ल इस तरह के अजीब दिखने वाले वाक्यविन्यास का समर्थन करता है?

+5

अगर आपको लगता है कि * * वाक्य रचना अजीब है ... –

+9

पर्ल न कारणों और न ही बहाने की जरूरत है। पर्ल पर्ल है। –

+0

@pst - मैं आपको एक अजनबी को पेश करने की हिम्मत करता हूं :) – DVK

उत्तर

25

Modern Perl blog पर विषय पर क्रोमैटिक के उत्कृष्ट हालिया ब्लॉग पोस्ट को उद्धृत करने के लिए: "पागलपन अस्पष्टता से बचने के लिए।"

इसे समझने के लिए क्यों इस तरह के वाक्य रचना उपयोगी है, यहां एक उदाहरण अपने नमूना से विकसित किया गया है:

package a; 
our $fh; 
use IO::File; 
sub s { 
    return $fh = IO::File->new(); 
} 

package a::s; 
sub binmode { 
    print "BINMODE\n"; 
} 

package main; 
a::s->binmode; # does that mean a::s()->binmode ? 
       # calling sub "s()" from package a; 
       # and then executing sub "open" of the returned object? 
       # In other words, equivalent to $obj = a::s(); $obj->binmode(); 
       # Meaning, set the binmode on a newly created IO::File object? 

a::s->binmode; # OR, does that mean "a::s"->binmode() ? 
       # calling sub "binmode()" from package a::s; 
       # Meaning, print "BINMODE" 

a::s::->binmode; # Not ambiguous - we KNOW it's the latter option - print "BINMODE" 
9

a:: एक स्ट्रिंग शाब्दिक कि स्ट्रिंग a उत्पादन होता है। सभी एक ही:

a->func() # Only if a doesn't exist as a function. 
"a"->func() 
'a'->func() 
a::->func() 
v97->func() 
chr(97)->func() 

आदि

>perl -E"say('a', a, a::, v97, chr(97))" 
aaaaa 
+1

+1। एक और +1 अगर आप मुझे बताते हैं कि पिछले दो को कैसे याद किया जाए। – DVK

+0

@ डीवीके, 'सीआर' एक बहुत उपयोगी काम है। यह स्पष्ट रूप से इसका उपयोग करने की जगह नहीं है, हालांकि। 'v97' एक संस्करण स्ट्रिंग है, और यह संस्करण स्ट्रिंग के रूप में उपयोग करने के लिए भी विशेष रूप से अच्छा नहीं है। – ikegami

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